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));
关于.net-4.0 - Parallel.ForEach是否需要AsParallel(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2270097/