如何在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);
}
答
你需要用Try..catch
包住行动:
Action act6 =
() =>
{
try
{
DummyFunction("act6 throws exception", exception: new Exception("thrown by act6"));
}
catch(exception ex)
{
// Do something
}
};
或者,你可以使用try.. catch
内DummyFunction
但它是微不足道的,你不希望这样做。
我相信如果你调用它,异常将从'EndInvoke'抛出。 – slawekwin
值得指出的是,异步调用委托并在调用线程中等待异步执行完成是没有意义的。人们希望你的真实代码不像你在这里发布的代码。 –
@slawekwin,我无法通过围绕'EndInvoke'尝试''来捕获异常。 –