首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Parallel.ForEach()与foreach(IEnumerable<T>.AsParallel())

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

Stack Overflow用户
提问于 2010-09-25 02:45:29
回答 3查看 72.8K关注 0票数 148

Erg,我试图使用Reflector在BCL中找到这两个方法,但找不到它们。这两个代码片段之间有什么区别?

答:

代码语言:javascript
复制
IEnumerable<string> items = ...

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

B:

代码语言:javascript
复制
IEnumerable<string> items = ...

foreach (var item in items.AsParallel())
{
   ...
}

使用其中一个比使用另一个有不同的后果吗?(假设我在这两个示例的方括号主体中所做的任何操作都是线程安全的。)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-25 02:51:54

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

第一个函数接受匿名委托,并在此代码上并行运行多个线程来处理所有不同的项。

第二个在这个场景中不是很有用。简而言之,它的目的是在多个线程上进行查询,并将结果组合在一起,然后再次将其传递给调用线程。因此foreach语句上的代码始终位于UI线程上。

只有当您在AsParallel()调用右侧的linq查询中执行一些开销较大的操作时,它才有意义,例如:

代码语言:javascript
复制
 var fibonacciNumbers = numbers.AsParallel().Select(n => ComputeFibonacci(n));
票数 151
EN

Stack Overflow用户

发布于 2010-09-25 03:15:50

第二个方法不是并行的,在示例中使用AsParallel()的正确方法应该是

代码语言:javascript
复制
IEnumerable<string> items = ...

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

Stack Overflow用户

发布于 2010-09-25 03:01:26

区别在于,B不是平行的。AsParallel()所做的唯一一件事就是包装一个IEnumerable,这样当您使用LINQ方法时,就会使用它们的并行变体。包装器的GetEnumerator() (在foreach中的幕后使用)甚至返回原始集合的GetEnumerator()的结果。

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

票数 53
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3789998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档