Answers:
他们做的事情完全不同。
第一个使用匿名委托,并针对所有不同项在此代码上并行运行多个线程。
第二个在这种情况下不是很有用。简而言之,它旨在对多个线程进行查询,并将结果组合在一起,然后再次将其提供给调用线程。因此,foreach语句上的代码始终保留在UI线程上。
仅当您在AsParallel()
调用右侧的linq查询中执行一些昂贵的操作时才有意义,例如:
var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));
区别在于,B不是平行的。唯一要做的AsParallel()
是,它将包裹起来IEnumerable
,以便在使用LINQ方法时使用它们的并行变体。包装器GetEnumerator()
(在幕后使用foreach
)甚至返回原始集合的结果GetEnumerator()
。
顺便说一句,如果您想查看Reflector中的方法,请在AsParallel()
程序集中的 System.Linq.ParallelEnumerable
类中System.Core
。Parallel.ForEach()
在mscorlib
程序集中(名称空间System.Threading.Tasks
)。
.Select()
,它会调用ParallelEnumerable.Select()
而不是normal Enumerable.Select()
。
第二种方法不会并行,在您的示例中使用AsParallel()的正确方法是
IEnumerable<string> items = ...
items.AsParallel().ForAll(item =>
{
//Do parallel stuff here
});