我有一个采用回调参数异步执行的方法,但是 catch block 似乎没有捕获同步调用抛出的任何异常(this.Submit
指的是同步方法).
public void Submit(FileInfo file, AnswerHandler callback)
{
SubmitFileDelegate submitDelegate = new SubmitFileDelegate(this.Submit);
submitDelegate.BeginInvoke(file, (IAsyncResult ar) =>
{
string result = submitDelegate.EndInvoke(ar);
callback(result);
}, null);
}
有没有办法捕获新线程抛出的异常并发送给原线程?另外,这是处理异步异常的“正确”方法吗?我写了我的代码,所以它可以这样调用(假设异常问题已解决):
try
{
target.Submit(file, (response) =>
{
// do stuff
});
}
catch (Exception ex)
{
// catch stuff
}
但是有没有更合适或更优雅的方法来做到这一点?
最佳答案
如果您的目标是 .NET 4.0,则可以利用新的任务并行库,并观察 Task
对象的 Exception
属性。
public Task Submit(FileInfo file)
{
return Task.Factory.StartNew(() => DoSomething(file));
}
private void DoSomething(FileInfo file)
{
throw new Exception();
}
然后像这样使用它:
Submit(myFileInfo).ContinueWith(task =>
{
// Check task.Exception for any exceptions.
// Do stuff with task.Result
});
其中 DoSomething
是您想要异步调用的方法,您传递给 ContinueWith
的委托(delegate)是您的回调。
可以在此处找到有关 TPL 中异常处理的更多信息:http://msdn.microsoft.com/en-us/library/dd997415.aspx
关于c# - 捕获异步回调中抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8748645/