Parallel.ForEach()和foreach(IEnumerable.AsParallel())的比较?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (48)

这两个片段有什么区别?

片段a:

IEnumerable<string> items = ...

Parallel.ForEach(items, item => {
   ...
});

b:

IEnumerable<string> items = ...

foreach (var item in items.AsParallel())
{
   ...
}

两者结果相同吗?

提问于
用户回答回答于

非常不同。

第一个采用匿名委托,并在所有不同的项目上并行运行此代码上的多个线程。

第二个在这种情况下不是很有用。简而言之,它对多个线程进行查询,并将结果合并,并再次将其提供给调用线程。所以foreach语句中的代码始终保持在UI线程上。

它只有在你在linq查询中进行一些高消耗的AsParallel()调用时才有意义,比如:

 var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));
用户回答回答于

AsParallel()唯一要做的事情就是围绕着一个IEnumerable,这样当你使用LINQ方法时,就会使用它们的并行变体。GetEnumerator()(在后台使用foreach)甚至可能返回原始集合的结果GetEnumerator()

扫码关注云+社区