从本地初始化 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();
   });

从本地初始化 lambda 终止 Parallel.ForEach 循环的最佳方法是什么?

也许是这样的。

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()可能是更好的选择。