2012-04-16 8 views
1

4つの異なるジョブを並列実行しているアプリケーションがあります。私は、並列タスク・ライブラリーを使用します。タスク並列ライブラリと例外

コードは次のようになります。

while (true) 
     { 
      var fetch = new FetcherHandler(); 

      var tasks = new Task[4]; 

      tasks[0] = Task.Factory.StartNew(fetch.GetJobs); 

      tasks[1] = Task.Factory.StartNew(fetch.GetStatusNew); 

      tasks[2] = Task.Factory.StartNew(fetch.GetJobsForStatus); 

      tasks[3] = Task.Factory.StartNew(fetch.GetStatusOld); 
      Task.WaitAll(tasks); 

      Thread.Sleep(10000); 
     } 

すべてのこれらの4つのタスクが終わることはありませんループしているので、上記のThread.sleepに到達することはありません。最初のタスクのコード例:

public void GetJobs() 
     { 
    while (true) 
      { 
       try 
        { 
         handler.GetNewJob(); 
         } 
        catch (Exception exception) 
        { 
          var mail = new MailService(); 
          mail.SendExeption("Error has accured in GetJobs", exception); 
          throw; 
         } 
        } 
       } 
       Thread.Sleep(15000); }} 

上記のコードはうまく機能し、いくつかのジョブを実行してから15秒間スリープしてからもう一度やります。私は例外が発生したときに問題が発生します。

例外は正常に捕捉され、私にメールを送信しますが、例外後にループ内でthredが続行されないため、GetNewJob()メソッドは決して再び実行されません。

例外が発生したときにスレッドに何が起こり、どのようにスレッドを「保存」して続けることができますか?

+0

質問には関係ありませんが、未処理のタスクを待っているのは何ですか? – hvd

答えて

2

Becasueあなたthrow例外なので、例外は上の伝播スタックの先頭に移動し、ソーススレッドの実行を中断します。

catch (Exception exception) 
{ 
    var mail = new MailService(); 
    mail.SendExeption("Error has accured in GetJobs", exception); 
    throw; //THIS LINE ! 
} 

あなたは、それを高めるためにイベントを使用すると言う、ExceptionCaught(..)とあなたのプログラム内のそのイベントをリッスンすることができます。

+0

ありがとう!このスローがアプリケーション全体またはスレッドだけを殺すかどうか知っていますか?提供されたコードを見て – Fore

+0

、それはアプリケーションを殺すでしょう – Tigran

1

catch節の末尾にあるthrow;を削除するだけです。

MSDNから

throw文は、catchステートメントでキャッチされた 例外を再スローするcatchブロックで使用することができます。

だから、あなたは...再び実行したことがない、

詳しい情報は、スレッドが中断する原因とキャッチした例外を再スローしている:What happens when a .NET thread throws an exception?

関連する問題