繁体   English   中英

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

[英]Parallel.ForEach() vs. foreach(IEnumerable<T>.AsParallel())

Erg,我正在尝试使用Reflector在BCL中找到这两个方法,但找不到它们。 这两个片段之间的区别是什么?

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方法时,会使用它们的并行变体。 包装器的GetEnumerator() (在foreach的幕后使用)甚至返回原始集合的GetEnumerator()

顺便说一句,如果你想查看Reflector中的方法, AsParallel()是在System.Core程序集中的System.Linq.ParallelEnumerable类中。 Parallel.ForEach()位于mscorlib程序集(名称空间System.Threading.Tasks )中。

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

IEnumerable<string> items = ...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM