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 });