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));
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top