19

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));
4

1 に答える 1

23

それは何が呼ばれているのかに依存します、それらは別々の問題です。

.AsParallel()タスクの委任ではなく、列挙を並列化します。

Parallel.ForEachループを並列化し、各要素のワーカースレッドにタスクを割り当てます。

したがって、ソースの列挙が並列になることで得られない限り(たとえばreader.Match(file)、高価である場合)、それらは等しくなります。最後の質問ですが、はい、どちらも正しいです。

また、PLINQの最大のメリットを享受しながら、少し短縮するもう1つの構成を確認することをお勧めします。

GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));
于 2010-02-16T01:54:58.220 に答える