2016-04-11 3 views
1

Ich muss SendEmail() in meinem C# -Code unten aufrufen, damit mein Programm wegen der Methode SendEmail() nicht blockiert wird, die viel Zeit in Anspruch nimmt oder fehlschlägt.Aufruf der Methode, damit das Programm nicht blockiert wird

Hier ist mein C# -Code:? (Ich verwende .Net 4,5)

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

Kann ich das gleiche erreichen mit folgenden bitte Oder gibt es einen anderen besseren Ansatz ist mit Asynchron/await einem besseren Ansatz um das zu erreichen?

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]); 
     } 

Und falls ich brauche SendEmailAlert() -Methode wie Feuer zu machen und vergessen, kann ich Code verwendet das richtig sein? ---->

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

Danke.

+1

Blick in async/erwarten –

+0

Sie Threading verwenden können, aber es ist wahrscheinlich besser zu nutzen async/erwarten für diese. – ChrisF

Antwort

0

Async erwarten kann definitiv helfen. Wenn Sie über asynchrone CPU-gebundene Arbeit verfügen, können Sie Task.Run() verwenden. Diese Methode kann "erwartet" werden, so dass der Code nach der Ausführung der Aufgabe fortgesetzt wird.

Hier ist, was ich in Ihrem Fall tun würde:

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

Vielen Dank. Und falls ich die SendEmailAlert() Methode als Feuer und vergessen machen muss, kann ich das await Schlüsselwort entfernen und es wie unten benutzen ... wäre das korrekt? ----> Aufgabe.Run (() => SendEmailAlert (arrEmailInfo)); –

+0

@Vineetv Ja, in diesem Fall können Sie die Wartezeit entfernen! –

Verwandte Themen