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

时间:2013-01-24 17:38:39

标签: c# parallel.foreach

在我的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();
   });

2 个答案:

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