2013-01-08 136 views
25

下面的代碼片段有什麼區別嗎?如果是這樣,什麼?AsParallel.ForAll vs Parallel.ForEach

myList.AsParallel().ForAll(i => { /*DO SOMETHING*/ });

Parallel.ForEach(mylist, i => { /*DO SOMETHING*/ });

將會在主線程等待所有子線程來完成?在MVC應用程序中,如果我在我的控制器操作中執行並行處理,主線程完成後子線程會發生什麼情況。即使在主線程完成之後它們會被中止還是會完成?

+1

我建議你閱讀:http://reedcopsey.com/2010/02/03/parallelism-in-net-part-8-plinqs-forall-method/ – Mir

+4

如果我是你,我會打開另一個問題爲您的MVC並行處理thingy。 – Pacane

+0

請小心AsParallel().ForAll(),因爲它會導致不可預測的結果。例如,我有一個按鈕來執行此代碼時單擊:myEnumerable.AsParallel()。ForAll(我作爲字符串=> otherDictionary.Add(i,0))。它會將null作爲關鍵字添加到otherDictionary中。我不得不重寫使用foreach循環。奇怪的。 – YukiSakura

回答

19

Parallel.ForEach()準確地用於這種類型的代碼。

另一方面,ForAll()旨在用於(可能是複雜的)PLINQ查詢的末尾。

因此,我認爲Parallel.ForEach()是更好的選擇。

在這兩種情況下,當前線程將用於執行計算(以及線程池中的一些線程),並且只有在所有處理完成後方法纔會返回。

+3

爲什麼ForAll()打算在PLINQ查詢的末尾使用? –

+2

@AranMulholland根據[Reed Copsey](http://reedcopsey.com/2010/02/03/parallelism-in-net-part-8-plinqs-forall-method/)並行查詢消耗的並行查詢。 Foreach()必須支付兩次並行化的成本。而ForAll()使用查詢中的現有分區/線程。 – Kabbalah

+1

我想'因爲'Parallel.ForEach()'來自'System.Threading.Tasks'命名空間,所以它更可能與任務有關。而'AsParallel().ForAll'來自'System.Linq'命名空間,因此更適合用於PLINQ。 – Ben

-1

您可以選擇使用AsParallel()。AsOrdered()對元素進行排序。 Order.in Parallel.ForEach不是開箱即用,我們需要做到這一點。

+0

'AsOrdered()'影響* results *的排序。而且由於'ForAll()'沒有任何結果,'AsOrdered()'在這裏沒有任何效果。如果您正在討論處理的順序,那麼僅適用於單線程計算纔有意義。 – svick

+0

我是說你使用ForAll()和AsOrdered()?請檢查。 – thewpfguy

+0

對不起,我的錯。但是,使用AsOrdered with Parallel.ForEach使得更加有意義,原始非平行集合已經排序,所以添加.AsParallel()。AsOrdered()將不會產生任何效果。此外,嘗試命令並行計算很少有意義。 – svick