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