2013-06-04 45 views
12

我有一個巨大的集合,我想以並行方式處理每個對象。做同步通常涉及一個簡單的「foreach」。想知道在我的場景中使用什麼,即Parallel.ForEach或MyCollection.AsParallel()。ForAll()。Parallel.ForEach vs AsParallel()。ForAll

您能否介紹一下使用這種方法的好處?

+1

這似乎相關; http://stackoverflow.com/questions/2270097/does-parallel-foreach-require-asparallel?rq=1 – Patrick

+1

可能的重複[使用.AsParallel()併發化任務.ForAll或Parallel.ForEach性能問題](http: //stackoverflow.com/questions/8415998/parallelizing-a-task-using-asparallel-forall-or-parallel-foreach-performance) – Patrick

回答

17

我看到它的方式,如果您只想並行化foreach,則應使用其並行版本,即Parallel.ForEach()

ParallelEnumerable.ForAll()適用於具有LINQ查詢後跟foreach的特定情況,並且您希望將它們並行化。因此,您所做的是通過添加AsParallel()並行化LINQ查詢,然後通過將其更改爲ForAll()來並行化foreach

5

時間和挑選贏家。

我發現Parallel.ForEach在最令人愉快的並行場景中執行得更好。看起來它使用更先進的工作平衡模式。 PLINQ主要是爲了平行查詢。

-2

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

1

我的2美分:

隨着ForAll可以使用WithDegreeOfParallelism擴展方法指定並行的期望水平。

With ForEach您只能限制最高級別。

基本上,你可以強制ForAll使用更多的線程。