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