Parallel.ForEachは(AsParallelが必要なん)
-
20-09-2019 - |
質問
ParallelEnumerable
は静的メンバーAsParallel
を有しています。私はIEnumerable<T>
を持っているし、それは私がいつもParallel.ForEach
を使用する必要があることを意味するものではないAsParallel
を使用したい場合は?
例えば。 これらの正しい(他のすべて等しい)の両方がありますか?
AsParallel
なします:
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)), f => list.Add(f));
またはAsParallel
と?
List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f));
解決
これは呼ばれているものに依存して、彼らは別の問題である。
.AsParallel()
はを列挙のないタスクの委任を並列ます。
Parallel.ForEach
並列化のループは、各要素のワーカースレッドにタスクを割り当てる。
だから、平行になってからソース列挙利益がない限り(例えばreader.Match(file)
は高価である)、彼らは同じです。あなたの最後の質問に、はい、両方のも正しいです。
また、まだPLINQの最大の利益を得て、あなたはそれを見てみたいことがあり一つの他の構築物が、それを少し短縮があります:
GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));
所属していません StackOverflow