2013-01-08 17 views
25

以下のコードスニペットには違いがありますか?もしそうなら、何?AsParallel.ForAll対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の並列処理のために。 – Pacane

+0

予期しない結果を引き起こすAsParallel()、ForAll()に注意してください。たとえば、このコードをクリックすると、myEnumerable.AsParallel()。ForAll(iはstring => otherDictionary.Add(i、0))というボタンが表示されます。 otherDictionaryのキーとしてnullが追加されます。私は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/)によれば、Parallelで消費される並列クエリです。 Foreach()は、パラレル化のコストを2回支払わなければなりません。 ForAll()はクエリの既存のパーティション/スレッドを使用します。 – Kabbalah

+1

'Parallel.ForEach()'は 'System.Threading.Tasks'名前空間から来たので、それはタスクに関連している可能性が高いと思います。 'AsParallel()。ForAll'は' System.Linq'名前空間からのものですが、PLINQのほうが使いやすくなるでしょう。 – Ben

-1

AsParallel()、AsOrdered()で要素を並べ替えることができます。 Parallel.ForEachの注文はすぐにはできません。

+0

'AsOrdered()'は* results *の順序に影響します。 'ForAll()'には結果がないので、 'AsOrdered()'はここで何の効果もありません。処理の順序付けについて言えば、それはシングルスレッドの計算の場合にのみ意味があります。 – svick

+0

ForAll()をAsOrdered()で使用していますか?チェックしてください。 – thewpfguy

+0

申し訳ありませんが、私の間違いです。しかし、AsOrderedをParallel.ForEachで使用すると、あまり意味がなくなり、元の非平行コレクションはすでに順序付けされているため、.AsParallel()。AsOrdered()を追加しても効果はありません。さらに、並列計算を秩序立てようとすることはめったに意味がありません。 – svick

関連する問題