Parallel.ForEach()与foreach(IEnumerable <T> .AsParallel())

呃,我试图find使用reflection器BCL这两个方法,但无法find它们。 这两个片段有什么区别?

A:

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

B:

 IEnumerable<string> items = ... foreach (var item in items.AsParallel()) { ... } 

使用另一个有不同的后果吗? (假设我在两个例子的括号内都是线程安全的。)

他们做了完全不同的事情。

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

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

如果你在AsParallel()调用的右边的linq查询中做了一些昂贵的事情,这只是有意义的,如:

  var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n)); 

不同的是,B不平行。 AsParallel()所做的唯一的事情就是包装一个IEnumerable ,所以当你使用LINQ方法的时候,它们的并行variables就被使用了。 包装器的GetEnumerator() (在foreach后面使用)甚至返回原始集合的GetEnumerator()

顺便说一句,如果你想看reflection器中的方法, AsParallel()System.Core程序集的System.Linq.ParallelEnumerable类中。 Parallel.ForEach()mscorlib程序集(命名空间System.Threading.Tasks )中。

第二种方法将不会平行在你的例子中使用AsParallel()的正确方法是

 IEnumerable<string> items = ... items.AsParallel().ForAll(item => { //Do parallel stuff here });