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()
准备了用于并行执行的枚举,特别是在这种情况下是.SelectMany()
的并行版本。想象一下一个有繁重Where
子句但没有顺序的枚举,我们可以通过尽可能多地在多个内核上同时评估where子句,将下一个枚举传递给下一个可用线程,从而使其快近n
倍。之后我们处理该结果的方式也可以以相同的方式处理,即在一个线程中同步处理或根据可用协处理器分布处理,这就是Parallel.ForEach
或.ForAll
部分。明白了吗? - Nick Craver