えーっと、Reflector を使用して BCL でこれら 2 つのメソッドを見つけようとしているのですが、見つかりません。これら 2 つのスニペットの違いは何ですか?
答え:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
バ:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
どちらか一方を使用すると、結果は異なりますか? (両方の例の括弧で囲まれた部分で行っていることはすべてスレッドセーフであると想定します。)
ベストアンサー1
彼らは全く違うことをします。
最初のものは匿名デリゲートを受け取り、このコード上でさまざまな項目すべてに対して複数のスレッドを並列に実行します。
2 番目は、このシナリオではあまり役に立ちません。簡単に言うと、複数のスレッドでクエリを実行し、その結果を結合して、呼び出し元のスレッドに再度渡すことを目的としています。そのため、foreach ステートメントのコードは常に UI スレッド上に残ります。
AsParallel()
次のように、呼び出しの右側の linq クエリでコストのかかる操作を実行する場合にのみ意味があります。
var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));