Parallel.ForEach是否需要AsParallel()

时间:2010-02-16 01:29:03

标签: .net-4.0 plinq task-parallel-library

ParallelEnumerable有一个静态成员AsParallel。如果我有IEnumerable<T>并希望使用Parallel.ForEach,这意味着我应该始终使用AsParallel吗?

e.g。 这些都是正确的(其他一切都相同)吗?

没有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));

1 个答案:

答案 0 :(得分:22)

这取决于所谓的内容,它们是不同的问题。

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

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

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

此外,还有一个你可能想看的构造缩短了一点,仍然获得了PLINQ的最大好处:

GetFileList().Where(file => reader.Match(file)).ForAll(f => list.Add(f));