parallecl.foreach()vs。foreach(ienumerable .asparallel())
-
05-10-2019 - |
質問
ERG、私はリフレクターを使用してBCLでこれら2つの方法を見つけようとしていますが、それらを見つけることはできません。これら2つのスニペットの違いは何ですか?
A:
IEnumerable<string> items = ...
Parallel.ForEach(items, item => {
...
});
B:
IEnumerable<string> items = ...
foreach (var item in items.AsParallel())
{
...
}
一方を他方よりも使用することの結果は異なりますか? (私が両方の例の括弧付きの体でやっていることは、スレッド安全であると仮定します。)
解決
彼らはまったく違うことをします。
最初のものは匿名の代表者を取り、このコードで複数のスレッドをすべての異なるアイテムに対して並行して実行します。
2番目のものは、このシナリオではあまり役に立ちません。一言で言えば、複数のスレッドでクエリを実行し、結果を組み合わせて、呼び出しスレッドに再度提供することを目的としています。したがって、foreachステートメントのコードは、常にUIスレッドにとどまります。
右側のLINQクエリで高価なことをする場合にのみ理にかなっています AsParallel()
電話してください:
var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));
他のヒント
違いは、Bは平行ではないということです。唯一のもの AsParallel()
それは、それがラップするということです IEnumerable
, 、そのため、LINQメソッドを使用すると、並列バリアントが使用されます。ラッパーの GetEnumerator()
(これは舞台裏で使用されています foreach
)元のコレクションの結果を返します GetEnumerator()
.
ところで、あなたがリフレクターの方法を見たいなら、 AsParallel()
の中に System.Linq.ParallelEnumerable
のクラス System.Core
組み立て。 Parallel.ForEach()
の中に mscorlib
アセンブリ(名前空間 System.Threading.Tasks
).
2番目の方法は、例でAsparallel()を使用する正しい方法では並行していません。
IEnumerable<string> items = ...
items.AsParallel().ForAll(item =>
{
//Do parallel stuff here
});