2016-08-02 1 views
0

Ich habe einige Aufgabe blockiert, die Ausnahmen auslöst, zum Beispiel:Wie fangen Sie eine Ausnahme in einer asynchron aufgerufenen Aktion in C# ab?

public static string DummyFunction(string msg = "Dummy Funciton", int seconds = 2, string retval = null, Exception exception = null) 
    { 
     if (exception != null) 
     { 
      throw exception; 
     } 
     Console.WriteLine("Start: " + msg); 
     System.Threading.Thread.Sleep(seconds * 1000); 
     Console.WriteLine("End: " + msg); 
     return retval; 
    } 

ich diese Methode asynchron aufrufen, aber wie kann ich die Ausnahme abfangen?

try 
     { 
      Action act6 =() => DummyFunction("act6 throws exception", exception: new Exception("thrown by act6")); 
      var ar6 = act6.BeginInvoke(null, null); 
      ar6.AsyncWaitHandle.WaitOne(); 
     } 
     catch (Exception e) 
     { 
      // Cannot reach here. 
      Console.WriteLine("Exception caught: {0}", e); 
     } 
+0

Ich glaube, die Ausnahme wird von 'EndInvoke' ausgelöst, wenn Sie es aufrufen. – slawekwin

+0

Es lohnt sich, darauf hinzuweisen, dass es keinen Sinn macht, einen Delegaten asynchron aufzurufen und dann einfach im aufrufenden Thread zu warten, bis die asynchrone Ausführung abgeschlossen ist. Man hofft, dass Ihr realer Code nicht wie der Code ist, den Sie hier gepostet haben. –

+0

@slawekwin, ich kann die Ausnahme nicht durch "versuchen" um "EndInvoke" fangen. –

Antwort

0

Sie müssen die Aktion mit einem Try..catch wickeln:

Action act6 = 
() => 
{ 
    try 
    { 
     DummyFunction("act6 throws exception", exception: new Exception("thrown by act6")); 
    } 
    catch(exception ex) 
    { 
     // Do something 
    } 

}; 

Alternativ Sie try.. catch innerhalb DummyFunction verwenden können, aber es war trivial, dass Sie das nicht tun wollen.

Verwandte Themen