【发布时间】:2012-06-07 10:50:21
【问题描述】:
在我的 Parallel.ForEach 循环中,localFinally 委托确实在所有线程上被调用。 我发现当我的并行循环停止时会发生这种情况。 在我的并行循环中,我有大约三个条件检查阶段,它们在循环完成之前返回。似乎是当线程从这些阶段返回而不是整个主体的执行时,它才不会执行 localFinally 委托。
循环结构如下:
var startingThread = Thread.CurrentThread;
Parallel.ForEach(fullList, opt,
()=> new MultipleValues(),
(item, loopState, index, loop) =>
{
if (cond 1)
return loop;
if (cond 2)
{
process(item);
return loop;
}
if (cond 3)
return loop;
Do Work(item);
return loop;
},
partial =>
{
Log State of startingThread and threads
} );
我在一个小数据集上运行循环并详细记录,发现虽然 Parallel.ForEach 完成了所有迭代,并且 localFinally 的最后一个线程的日志是 -
线程 6 Loop Indx 16 的调用线程状态是 WaitSleepJoin
循环仍然没有优雅地完成并且仍然停滞不前......任何线索为什么会停滞?
干杯!
【问题讨论】:
-
某处可能出现死锁
-
可能只是伪代码,但在当前状态下永远不会达到 cond 3。 if(cond2) 在条件周围没有括号(因此只有 process(item) 属于它)。
-
@RobertVerpalen 不,这只是由于省略了括号而导致的伪代码中的错误......
-
快一点,日志机制是如何实现的?日志记录机制可能是问题吗?我曾经花了一天时间寻找一个问题,我的稍微错误的日志告诉我存在(但没有)=P
-
也许您只是误解了
localFinally的含义。它不是为每个项目调用的,而是为Paralle.ForEach()使用的每个线程调用的。并且许多项目可以共享同一个线程。
标签: c# multithreading task-parallel-library