【发布时间】:2014-09-10 15:35:56
【问题描述】:
我有 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:
从接受的答案来看,即使迭代次数很大,也不是问题。事实上,根据此 url 上的一篇文章:Potential Pitfalls in Data and Task Parallelism,当迭代次数多且迭代次数较少时,并行循环可能不会比顺序/同步循环提供任何好处。
因此,在循环中进行大量迭代似乎是使用 Parallel.ForEach 的最佳情况。
基本的经验法则是,迭代次数少且用户委托速度快的并行循环不太可能加速很多。
【问题讨论】:
标签: c#-4.0 task-parallel-library class-library