149

エルグ、Reflectorを使用してBCLでこれら2つのメソッドを見つけようとしていますが、見つけることができません。これら2つのスニペットの違いは何ですか?

A:

IEnumerable<string> items = ...

Parallel.ForEach(items, item => {
   ...
});

B:

IEnumerable<string> items = ...

foreach (var item in items.AsParallel())
{
   ...
}

どちらか一方を使用すると、異なる結果が生じますか?(両方の例の括弧で囲まれた本文で行っていることはすべてスレッドセーフであると想定します。)

4

3 に答える 3

153

彼らはまったく違うことをします。

最初のものは匿名デリゲートを受け取り、このコードで複数のスレッドをすべての異なる項目に対して並行して実行します。

2 番目のものは、このシナリオではあまり役に立ちません。簡単に言えば、複数のスレッドでクエリを実行し、結果を組み合わせて、呼び出し元のスレッドに再度渡すことを目的としています。そのため、foreach ステートメントのコードは常に UI スレッドに残ります。

AsParallel()次のように、呼び出しの右側にある linq クエリで高価なことを行う場合にのみ意味があります。

 var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));
于 2010-09-24T18:51:53.797 に答える
55

2 番目のメソッドは並列ではありません。例で AsParallel() を使用する正しい方法は次のようになります。

IEnumerable<string> items = ...

items.AsParallel().ForAll(item =>
{
    //Do parallel stuff here
});
于 2010-09-24T19:15:50.027 に答える
54

違いは、Bは平行ではないということです。唯一のことAsParallel()は、をラップアラウンドすることIEnumerableです。そのため、LINQメソッドを使用すると、それらの並列バリアントが使用されます。ラッパーGetEnumerator()(の舞台裏で使用されforeachます)は、元のコレクションの結果を返しますGetEnumerator()

ところで、Reflectorのメソッドを見たい場合は、アセンブリAsParallel()System.Linq.ParallelEnumerableクラスにあります。アセンブリ(名前空間)にあります。System.CoreParallel.ForEach()mscorlibSystem.Threading.Tasks

于 2010-09-24T19:01:26.170 に答える