在我的 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 的最后一个线程的日志是 -- Calling Thread State is WaitSleepJoin for Thread 6 Loop Indx
16循环仍然没有优雅地完成并且仍然停滞不前......任何线索为什么会停滞?
干杯!