我有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的最佳情況。
基本的經驗法則是,具有很少迭代和快速用戶委託的並行循環不太可能加速。