在我的Parallel.ForEach
循环中,我需要在“local init”lambda中初始化一些对象。
如果其中一个对象无法初始化,我想终止整个并行循环。
这样做的最佳方式是什么?
Parallel.ForEach(collection,
() => //local init
{
var localObjects= CreateObjects();
foreach (var obj in localObjects)
if (!obj.Initialize())
// want to terminate the entire parallel loop here!!
return localObjects;
}
(element, loopState, localObjects) => // loop body
{
// some code here
},
localObjects => // local finally
{
foreach (var obj in localObjects)
obj.Terminate();
});
答案 0 :(得分:3)
也许就是这样。
Parallel.ForEach(collection,
() => //local init
{
var localObjects= CreateObjects();
foreach (var obj in localObjects)
if (!obj.Initialize())
return null; // returning null as a "flag" for the loop
// body block to use
return localObjects;
},
(element, loopState, localObjects) => // loop body
{
if (state.IsStopped || localObjects == null)
{
// will signal to stop at earliest convenience
loopState.Stop();
// will make sure nothing is done this iteration
return null;
}
// some code here
},
localObjects => // local finally
{
foreach (var obj in localObjects)
obj.Terminate();
});
请注意,这意味着finally块中的localObjects也将为null,并且不会是Terminate()
d。
答案 1 :(得分:1)
执行此操作(不看任何代码)的最佳方法是检查您尝试初始化的对象是null
,如果是,break()
。
我希望这会有所帮助。
编辑。在发表一些评论之后,stop()
可能是更好的选择。