我有TPL(任务并行库)代码,用于在使用.NET 4.0的类库项目中在C#中并行执行循环。我是C#中的TPL的新手,并提出以下问题。Parallel.ForEach在C#中迭代次数未知时
代码背景: 在出现刚刚的问题后,我得到的所有未处理的批生产,然后处理每批一次一个代码。每个批次都可以独立处理,因为批次之间不存在依赖关系,但对于每批次,处理步骤的顺序非常重要。
我的问题是:
使用将Parallel.ForEach可取在这种情况下,其中的批数,因此迭代次数可能非常小或非常大的像万个批次?恐怕批量太多,在这种情况下使用并行可能会造成更多的伤害。
使用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的最佳情况。
基本的经验法则是,具有很少迭代和快速用户委托的并行循环不太可能加速。