我理解使用Parallel.ForEach循环,每个线程可能在任何给定时间执行循环的不同部分。但是,每个线程是否按顺序执行循环中的代码?我刚读到" on MSDN,上面写着:
有时,两个步骤的顺序与循环顺序相反。唯一的保证是,循环的所有迭代都将在循环结束时运行。
说我有以下几点:
IEnumerable<MyObject> myEnumerable = ...
Parallel.ForEach(myEnumerable, obj =>
{
A();
B();
C();
});我知道线程1可能在执行A(),而线程2可能正在执行C(),但是每个线程会在循环中顺序执行代码。线程1是做A() B() C()还是可能做B(),C(),A()
发布于 2015-09-16 15:28:30
迭代是整个循环体的单个执行,与代码中所表示的完全相同。
迭代可以(也很可能)以任何顺序开始、运行和完成(这将取决于实现细节和运行时数据,比如哪些工作人员可用,何时可用)。但是,每个单独的迭代都将被执行,就像循环是连续的(就像普通的foreach)一样,而不是并行的。
换句话说,它不可能对任何一个项目执行B()然后是C()然后是A()。它总是对每个项目执行A(),然后是B(),然后是C()。您只是不知道哪个项目将按什么顺序处理。
发布于 2015-09-16 15:29:57
Parallel.ForEach将为来自myEnumerable的每个元素执行指定的委托。例如:如果myEnumerable遍历5个元素,则序列A()、B()、C()将被调用5次(在大多数情况下是并行线程,但不能依赖于此)。不能保证所有线程同时对所有枚举元素执行A()方法,只有当所有线程中的所有A()方法都完成时才开始执行B()方法(需要额外的同步来实现这种行为)。
发布于 2015-09-16 15:30:56
正如对您的问题的注释中所述,Parallel.ForEach将按您编写的顺序在正文中执行您的代码。
但是,您在msdn上看到的警告引用了以下场景:
比方说,在您迭代并行的集合中有两个对象,a和b。您必须确保,对于您迭代的每个对象,主体中的步骤都是独立于任何其他迭代对象的独立的。
如果它们不是,那么值可能不是业务规则最终所期望的值。--更糟糕的是,您可能永远不知道它是,因为可能没有错误(如果没有发生NullException或除以零或发生任何其他错误)。
https://stackoverflow.com/questions/32612550
复制相似问题