2014-07-19 13 views
1

我有TPL(任务并行库)代码,用于在使用.NET 4.0的类库项目中在C#中并行执行循环。我是C#中的TPL的新手,并提出以下问题。Parallel.ForEach在C#中迭代次数未知时

代码背景: 在出现刚刚的问题后,我得到的所有未处理的批生产,然后处理每批一次一个代码。每个批次都可以独立处理,因为批次之间不存在依赖关系,但对于每批次,处理步骤的顺序非常重要。

我的问题是:

  1. 使用将Parallel.ForEach可取在这种情况下,其中的批数,因此迭代次数可能非常小或非常大的像万个批次?恐怕批量太多,在这种情况下使用并行可能会造成更多的伤害。

  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); 
    } 
    

更新1:

从接受的答案,迭代的次数是不是一个问题,即使它的大。实际上,根据这篇文章的一篇文章:Potential Pitfalls in Data and Task Parallelism,当迭代次数很多时,可能会发生并行性的性能改进,并且对于较少的迭代,并行循环不会对顺序/同步循环提供任何好处。

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

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

回答

2
  1. 并行的foreach将我们来为您正在运行的硬件线程的适当数量。因此,您不必担心导致伤害的批次太多

  2. 这些步骤将针对每批次运行。 ProcessBatch将在不同的线程上调用不同的批次,但是对于每个批次,这些步骤将按照它们在该方法中定义的顺序执行。