Dot-Net-4.0

Parallel.ForEach 是否需要 AsParallel()

  • February 16, 2010

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

引用自:https://stackoverflow.com/questions/2270097