2016-08-02 101 views
0

我有一些阻塞的任務,拋出異常,例如:如何在C#中異步調用動作中捕獲異常?

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

我異步調用此方法,但我怎麼能捕獲異常?

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

我相信如果你調用它,異常將從'EndInvoke'拋出。 – slawekwin

+0

值得指出的是,異步調用委託並在調用線程中等待異步執行完成是沒有意義的。人們希望你的真實代碼不像你在這裏發佈的代碼。 –

+0

@slawekwin,我無法通過圍繞'EndInvoke'嘗試''來捕獲異常。 –

回答

0

你需要用Try..catch包住行動:

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

}; 

或者,你可以使用try.. catchDummyFunction但它是微不足道的,你不希望這樣做。