3

使用Parallel.ForEach()時,有沒有辦法保證訂單?我正在循環的集合需要維護它的順序,但我正在尋找一些性能改進。Parallel.Foreach維護收集訂單嗎?

+0

你是什麼意思「擔保訂單」?例如,如果您有5個線程,並且項目3在項目4之前完成,則線程3將從項目6開始,並且隨着此過程的進行,您對訂單不確定。這是你想解決的問題嗎? – 2010-11-09 16:45:37

回答

-1

不,ForEach僅用於訂單無關緊要的條件;嘗試Parallel.For

+0

將Parallel.For維護我的收藏的順序? – 2010-11-09 16:48:30

+0

我想我應該問你要維護的是什麼 - 是不是像詹姆斯布萊克說的,你想處理IEnumerable中的項目?還是你想要確保進入的內容以相同的順序返回?如果是後者,那麼他們應該沒問題,不管是for還是foreach。如果它是前者,那麼你可能不想使用並行功能,因爲對這些項目進行操作會損害並行操作的收益。 – CodeMonkey1313 2010-11-09 16:58:58

+0

我正在使用我的foreach中的StringBuilder.WriteLine(),創建一排數據已經排序 – 2010-11-09 17:16:23

6

所以你有一個看起來像這樣的聲明? (根據您的意見)。

Parallel.Foreach(myData, ..., (d) => 
{ 
    StringBuilder sb = new StringBuilder(); 
    sb.Append(d); 
    // WriteLine sb? 
}); 

這種方法有很多問題。

  1. 無論Parallel.ForParallel.ForEach將保證你到myData內容訪問任何特定的順序進行訪問。
  2. 如果你在控制檯或方法的共享StringBuilder 要麼輸出結果,或建立一個完整的字符串,那麼你 很可能阻塞共享資源,有效地序列化 部分的並行循環。

如果沒有看到您的代碼的具體示例很難說更多。根據你在做什麼,你可能可以在PLINQ中使用保存命令AsOrdered()來獲得你想要的位置。
this MSDN ResourceOrdered PLINQ ForAll

這將允許你返回一個有序的結果集,根據輸入的命令,但不機制保障實際處理的順序上。 但是,如果並行查詢阻塞了正文中的呼叫,則您不太可能獲得良好的性能。

0

任何人尋找一個簡單的解決辦法,我已經發布(使用PLINQ使用Parallel.ForEach一加一)2種擴展方法作爲對以下問題的答案的一部分:

Ordered PLINQ ForAll