首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parallel.ForEach行为

Parallel.ForEach行为
EN

Stack Overflow用户
提问于 2015-09-16 15:13:24
回答 3查看 756关注 0票数 3

我理解使用Parallel.ForEach循环,每个线程可能在任何给定时间执行循环的不同部分。但是,每个线程是否按顺序执行循环中的代码?我刚读到" on MSDN,上面写着:

有时,两个步骤的顺序与循环顺序相反。唯一的保证是,循环的所有迭代都将在循环结束时运行。

说我有以下几点:

代码语言:javascript
复制
IEnumerable<MyObject> myEnumerable = ...
Parallel.ForEach(myEnumerable, obj =>
{
     A();
     B();
     C();
});

我知道线程1可能在执行A(),而线程2可能正在执行C(),但是每个线程会在循环中顺序执行代码。线程1是做A() B() C()还是可能做B()C()A()

EN

回答 3

Stack Overflow用户

发布于 2015-09-16 15:28:30

迭代是整个循环体的单个执行,与代码中所表示的完全相同。

迭代可以(也很可能)以任何顺序开始、运行和完成(这将取决于实现细节和运行时数据,比如哪些工作人员可用,何时可用)。但是,每个单独的迭代都将被执行,就像循环是连续的(就像普通的foreach)一样,而不是并行的。

换句话说,它不可能对任何一个项目执行B()然后是C()然后是A()。它总是对每个项目执行A(),然后是B(),然后是C()。您只是不知道哪个项目将按什么顺序处理。

票数 8
EN

Stack Overflow用户

发布于 2015-09-16 15:29:57

Parallel.ForEach将为来自myEnumerable的每个元素执行指定的委托。例如:如果myEnumerable遍历5个元素,则序列A()、B()、C()将被调用5次(在大多数情况下是并行线程,但不能依赖于此)。不能保证所有线程同时对所有枚举元素执行A()方法,只有当所有线程中的所有A()方法都完成时才开始执行B()方法(需要额外的同步来实现这种行为)。

票数 0
EN

Stack Overflow用户

发布于 2015-09-16 15:30:56

正如对您的问题的注释中所述,Parallel.ForEach将按您编写的顺序在正文中执行您的代码。

但是,您在msdn上看到的警告引用了以下场景:

比方说,在您迭代并行的集合中有两个对象,ab。您必须确保,对于您迭代的每个对象,主体中的步骤都是独立于任何其他迭代对象的独立的

如果它们不是,那么值可能不是业务规则最终所期望的值。--更糟糕的是,您可能永远不知道它是,因为可能没有错误(如果没有发生NullException或除以零或发生任何其他错误)。

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

https://stackoverflow.com/questions/32612550

复制
相关文章

相似问题

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