0

私のParallel.ForEachループには、「ローカル初期化」ラムダで初期化する必要があるオブジェクトがいくつかあります。これらのオブジェクトのいずれかが初期化に失敗した場合、並列ループ全体を終了したいと考えています。これを行う最善の方法は何ですか?

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 も null になり、何もTerminate()d にならないことを意味することに注意してください。

于 2013-01-24T18:35:26.400 に答える
1

これを行う最善の方法 (コードを表示せずに) はnull、初期化しようとしたオブジェクトが であるかどうかを確認することですbreak()

これが役立つことを願っています。

編集。この場合、いくつかのコメントに従うことをお勧めしstop()ます。

于 2013-01-24T17:54:04.753 に答える