当迭代次数未知时,C#中的Parallel.ForEach

时间:2014-07-19 17:13:25

标签: c#-4.0 task-parallel-library class-library

我有一个TPL(任务并行库)代码,用于在使用.Net 4.0的类库项目中在C#中并行执行循环。我是C#中的TPL新手并且有以下问题。

代码背景: 在问题之后出现的代码中,我将获得所有未处理的批次,然后逐个处理每个批次。每个批次都可以独立处理,因为批次之间没有依赖关系,但是对于每个批次,处理它时步骤的顺序非常重要。

我的问题是:

  1. 在这种情况下,使用Parallel.ForEach是否可取,其中批次的数量以及迭代次数可能非常小或非常大,如10,000批次?我担心批次太多,在这种情况下使用并行性可能会造成更多弊大于利。

  2. 使用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);
    }
    
  3. 更新1:

    从接受的答案中,迭代次数即使很大也不是问题。事实上,根据本网址上的一篇文章:Potential Pitfalls in Data and Task Parallelism,当存在多次迭代时,可能会出现并行性能提升,并且对于较少的迭代,并行循环不会提供顺序/同步循环的任何好处。

    因此,在循环中进行大量迭代似乎是使用Parallel.ForEach的最佳情况。

      

    基本的经验法则是,具有少量迭代和快速用户代理的并行循环不太可能加速。

0 个答案:

没有答案