2014-07-19 15 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將在不同的線程上調用不同的批次,但是對於每個批次,這些步驟將按照它們在該方法中定義的順序執行。