2016-04-11 14 views
1

以下のC#コードでSendEmail()メソッドを呼び出すと、SendEmail()メソッドがブロックされたり、時間がかかったり失敗したりする必要があります。プログラムがブロックされないようにする呼び出し方法

ここに私のC#のコードです:してください、次の私が使用して同じことを達成することができます

private void MyMethod() 
{ 
    DoSomething(); 
    SendEmail(); 
} 

を(私は純4.5を使用しています)やその他のより良い方法がある非同期/待つより良いアプローチを使用しているが?これを達成するために?

public void MyMethod() 
     { 
      DoSomething(); 

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

       System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(SendEmailAlert), arrEmailInfo); 
      } 
      catch (Exception ex) 
      { 
       //Log error message 
      } 

     } 

     private void SendEmailAlert(object state) 
     { 
      string[] arrEmailnfo = state as string[]; 
      MyClassX.SendAlert(arrEmailnfo[0], arrEmailnfo[1]); 
     } 

とケースでは、私は火のようSendEmailAlert()メソッドを作成し、忘れて、それが正しいだろう、私はこのようなコードを使用することができますする必要がありますか? ---->

Task.Run(()=> SendEmailAlert(arrEmailInfo)); 

ありがとうございます。

+1

ルックは/あなたがスレッドを使用することができます –

+0

を待つが、それは/このために待つの非同期を使用することがおそらく良いでしょう:

は、ここで私はあなたの場合にはどうなるのかです。 – ChrisF

答えて

0

Async awaitは間違いなくあなたを助けます。非同期で処理するCPUバインド作業がある場合は、Task.Run()を使用できます。このメソッドは、タスクが完了した後にコードが再開できるように「待つ」ことができます。非同期に

public async Task MyMethod() 
{ 
    DoSomething(); 

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

     await Task.Run(()=> SendEmailAlert(arrEmailInfo)); 

     //Insert code to execute when SendEmailAlert is completed. 
     //Be aware that the SynchronizationContext is not the same once you have resumed. You might not be on the main thread here 
    } 
    catch (Exception ex) 
    { 
     //Log error message 
    } 

} 

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

ありがとうございました。私はSendEmailAlert()メソッドをfireと忘れてしまわなければならない場合は、awaitキーワードを削除し、それを以下のように使用することができます。 ----> Task.Run(()=> SendEmailAlert(arrEmailInfo)); –

+0

@Vineetvはい、この場合、あなたは待っています! –

関連する問題