我有一个TPL(任务并行库)代码,用于在使用.Net 4.0的类库项目中在C#中并行执行循环。我是C#中的TPL新手并且有以下问题。
代码背景: 在问题之后出现的代码中,我将获得所有未处理的批次,然后逐个处理每个批次。每个批次都可以独立处理,因为批次之间没有依赖关系,但是对于每个批次,处理它时步骤的顺序非常重要。
我的问题是:
在这种情况下,使用Parallel.ForEach是否可取,其中批次的数量以及迭代次数可能非常小或非常大,如10,000批次?我担心批次太多,在这种情况下使用并行性可能会造成更多弊大于利。
使用Parallel.ForEach时,ProcessBatch方法中的步骤序列是否保证以与step1,step2,step3和step4相同的顺序执行?
public void ProcessBatches() {
List < Batch > batches = ABC.Data.GetUnprocessesBatches();
Parallel.ForEach(batches, batch = > {
ProcessBatch(batch);
});
}
public void ProcessBatch(Batch batch) {
//step 1
ABC.Data.UpdateHistory(batch);
//step2
ABC.Data.AssignNewRegions(batch);
//step3
UpdateStatus(batch);
//step4
RemoveBatchFromQueue(batch);
}
更新1:
从接受的答案中,迭代次数即使很大也不是问题。事实上,根据本网址上的一篇文章:Potential Pitfalls in Data and Task Parallelism,当存在多次迭代时,可能会出现并行性能提升,并且对于较少的迭代,并行循环不会提供顺序/同步循环的任何好处。
因此,在循环中进行大量迭代似乎是使用Parallel.ForEach的最佳情况。
基本的经验法则是,具有少量迭代和快速用户代理的并行循环不太可能加速。