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 的最大好处:

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