如何在C#中异步调用动作中捕获异常?

问题描述:

我有一些阻塞的任务,抛出异常,例如:如何在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'尝试''来捕获异常。 –

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

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

}; 

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