从本地初始化 lambda 终止 Parallel.ForEach 循环的最佳方法是什么?
本文关键字:循环 最佳 方法 是什么 ForEach Parallel 初始化 lambda 终止 | 更新日期: 2023-09-27 17:55:57
在我的Parallel.ForEach
循环中,我有一些对象需要在"本地初始化"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();
});
也许是这样的。
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 中的任何内容。
执行此操作的最佳
方法(无需查看任何代码)是检查您尝试初始化的对象是否null
,如果是,则break()
我希望这有所帮助。
编辑。根据一些评论,在这种情况下,stop()
可能是更好的选择。