【发布时间】:2012-02-03 15:21:37
【问题描述】:
我有一个采用回调参数异步执行的方法,但 catch 块似乎没有捕获同步调用引发的任何异常(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
}
但是有没有更合适或更优雅的方法来做到这一点?
【问题讨论】:
-
第一个代码示例中的 catch 块将捕获由回调或 EndInvoke 引发的异常。第二个代码示例中的 catch 块将捕获由 SubmitFileDelegate 构造函数或 BeginInvoke 引发的任何异常。哪一个没有做你期望/希望它做的事情?
-
糟糕,忘记删除了。我希望第二个能正常工作,但目前都没有。
-
你能说明
SubmitFileDelegate是如何定义的吗? -
只是一个非常通用的
private delegate string SubmitFileDelegate(FileInfo file);。
标签: c# asynchronous lambda callback