0

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

2 回答 2

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 也将为空,并且什么都不会是Terminate()d。

于 2013-01-24T18:35:26.400 回答
1

最好的方法(没有看到任何代码)是检查您尝试初始化的对象是否是null,如果是,break()

我希望这有帮助。

编辑。根据一些评论,stop()在这种情况下可能是更好的选择。

于 2013-01-24T17:54:04.753 回答