2016-04-11 20 views
0

TPLを初めて使用しました。 SendEmailAlert()メソッドが何らかのエラーをスローすると、例外を処理する必要があります。次のコードが正しく入力されていますか?タスクの例外の処理

public Task MyMethod() 
{ 
    DoSomething(); 

    try 
    { 
     string emailBody = "TestBody"; 
     string emailSubject = "TestSubject"; 

     Task.Run(()=> SendEmailAlert(arrEmailInfo)); 
    } 
    catch (AggregateException ex) 
       { 
        ex.Handle((e) => 
         { 
          log.Error("Error occured while sending email...", e); 
          return true; 
         } 
         ); 
       } 

} 

private void SendEmailAlert(string[] arrEmailInfo) 
{ 
    MyClassX.SendAlert(arrEmailnfo[0], arrEmailnfo[1]); 
} 

私はSendEmailAlert()メソッド内からエラーを強制しましたが、例外は捕捉されません。誰かに助言してもらえますか?

ありがとうございました。

+0

あなたはMSDNでこの記事を読むことがありますか? https://msdn.microsoft.com/en-us/library/dd997415(v=vs.110).aspx – Zack

答えて

1

あなたのTask.Runは別のコンテキストで実行されます(その中にtry/catchが必要、またはタスクが完了しているかどうかを確認する必要があります)。 async/awaitを使用するように変更することができます。

例:

public async void MyMethod() 
{ 
    try 
    { 
     await ExceptionMethod(); 
    } 
    catch (Exception ex) 
    { 
     // got it 
    } 
} 

public async Task ExceptionMethod() 
{ 
    throw new Exception(); 
} 
+0

Answerへのお返事ありがとうございます。SendEmailAlertへの私の呼び出しは、実際には "火災と忘れた"タイプです。 TAPデザインパターンを使用してください。他の方法をお勧めします。 –