5

使用時に注文を保証する方法はありParallel.ForEach()ますか?私がループしているコレクションは、その順序を維持する必要がありますが、パフォーマンスの向上を探していました。

4

5 に答える 5

8

それで、あなたはこのような声明を持っていますか?(上記のコメントに基づく)。

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

このアプローチには多くの問題があります。

  1. のコンテンツへのアクセスが特定の順序でアクセスされることを保証するものでParallel.Forもありません。Parallel.ForEachmyData
  2. StringBuilder 結果を出力するか、完全な文字列を構築するコンソールまたは共有のメソッドである場合、おそらく共有リソースでブロックされており、並列ループの一部を効果的にシリアル化しています。

コードの具体的な例を見ずにこれ以上言うのは難しいです。何をしているかによってはAsOrdered()、PLINQ の順序保存を使用して目的の場所に到達できる場合があります。この MSDN リソースOrdered PLINQ ForAll
を参照してください

これにより、入力順序に基づいて順序付けられた結果セットを返すことができますが、実際の処理の順序は保証されません。ただし、本体内の呼び出しで並列クエリがブロックされている場合、パフォーマンスが向上する可能性は低くなります。

于 2011-03-30T12:32:59.300 に答える
0

簡単な解決策を探している人Parallel.ForEachのために、次の質問に対する回答の一部として、2 つの拡張メソッド (1 つは PLINQ を使用し、もう 1 つは を使用) を投稿しました。

注文された PLINQ ForAll

于 2014-01-05T01:50:21.863 に答える
-3

いいえ、ForEachは、順序が重要ではない条件でのみ使用されます。Parallel.Forを試してください

于 2010-11-09T16:43:42.423 に答える