0

私はやっている作業をチェックしています。私は生産に問題があるコードを持っています。それはマルチスレッドを使用しており、私は比較的新しいです。エリアです。私は、問題であると信じているコードを取り出し、それをそのコアに分離しようとしたが、私の「モデル」を手抜きにしていた。これは私が思いついたものです。誰もが気にしているフィードバックを私は共有したいと思います。前もって感謝します。マルチスレッドコードで例外をキャッチし、継続を行うことを理解する

static void Main(string[] args) 
    { 
     var semaphoreSlim = new SemaphoreSlim(3); 

     Console.WriteLine("Starting loop"); 

     var foo = new[] {1, 2, 3, 4, 5, 6}; 

     foreach (var i in foo) 
     { 
      Console.WriteLine("Queueing task {0}", i); 

      var j = i; 
      var sl = i*1000; 

      var task = Task.Factory.StartNew(() => 
      { 
       semaphoreSlim.Wait(); 

       try 
       { 
        Console.WriteLine("Task {0} started - sleep {1} ms", j, sl); 
        Thread.Sleep(sl); 
        if (j == 2 || j == 5) throw new Exception("error"); 
        Console.WriteLine("Task {0} done", j); 
       } 
       catch (Exception) 
       { 
        Console.WriteLine("Caught exception {0}", j); 
        throw; 
       } 
       finally 
       { 
        semaphoreSlim.Release(); 
       } 
      }); 

      task.ContinueWith(x => Console.WriteLine("Continuation: Completed {0}", j), 
             TaskContinuationOptions.OnlyOnRanToCompletion); 

      task.ContinueWith(x => Console.WriteLine("Continuation: Faulted {0}", j), 
             TaskContinuationOptions.OnlyOnFaulted); 
     } 

     Console.WriteLine("Finished loop"); 

     Console.ReadLine(); 
    } 
+2

お困りですか? ( '私たちに問題を起こしている生産のコード') – sll

+1

何が問題なのですか? – svick

+0

プロセスはfooによって表されるグループの一部のメンバーをスキップしているようです。問題の一部は、try/catchがもともとforeachループを囲んでいたということでした。 foreachループ内で例外が発生すると、ループ全体が終了します。タスクの継続はここに示したStartNewのように思っていましたが、TryNatchにtry/catchがどのように配置されているかによって例外があった場合に呼び出されているとは思いません。ほとんどの場合、ここにあるものがエラーを捕捉して継続コードを実行する適切な方法であるかどうかを知りたい。 – BobC

答えて

0

「プロセスが一部のメンバーをスキップしているように見えます」という問題がどのように表示されますか?

出力に「Finished loop」が表示されたときにプロセスが完了したとみなした場合、タスクがまだ完了していない可能性があります。

"Finished loop"を書き込む前に、作成したタスクが完了するまで待ちます。

関連する問題