Parallel.ForEach是否需要AsParallel()

dka*_*man 18 .net-4.0 plinq task-parallel-library

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));
Run Code Online (Sandbox Code Playgroud)

还是用AsParallel

List<string> list = new List<string>();
Parallel.ForEach<string>(GetFileList().Where(file => reader.Match(file)).AsParallel(), f => list.Add(f));
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 23

这取决于被称为什么,它们是不同的问题.

.AsParallel()并行枚举而不是任务委派.

Parallel.ForEach并行化循环,为每个元素的工作线程分配任务.

因此,除非您的源枚举从并行中获益(例如reader.Match(file),价格昂贵),否则它们是相等的.对于你的上一个问题,是的,两者都是正确的.

另外,还有一个你可能想看的结构可以缩短它,仍然可以获得PLINQ的最大好处:

GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));
Run Code Online (Sandbox Code Playgroud)

  • @dkackman` .AsParallel()`准备并行执行的计数,特别是在这种情况下`.SelectMany()`的并行版本.考虑一个具有大量`Where`子句但没有顺序的枚举,我们可以在尽可能多的内核中同时评估where子句,将枚举中的下一个赋予下一个可用线程,使其几乎快了n倍.我们对该结果所做的事情也可以在之后以相同的方式处理,无论是在一个线程中同步还是在可用的内核中分布,那就是`Parallel.ForEach`或`.ForAll`部分,有意义吗? (3认同)
  • 嗯...究竟什么是枚举的并行化?或者至少如何将这种平行分离与任务授权分开? (2认同)