Dot-Net-4.0
Parallel.ForEach 是否需要 AsParallel()
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));