c# - 捕获异步回调中抛出的异常

标签 c# asynchronous lambda callback

我有一个采用回调参数异步执行的方法,但是 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/

相关文章:

javascript - 如何测试异步回调?

node.js - Mongoose 复杂(异步)虚拟

python - lambda 可以使用 *args 作为参数吗?

c# - 将 UTC 时间字符串反序列化为本地时间

c# - 在全局目录中验证用户身份

javascript - 如何使用todoist api v7创建todoist任务?

g++ - 当涉及到 lambda 函数的指针时,g++ 4.5.3 是否损坏?

java - 如何将这个 lambda 代码转换为 Java 中的方法引用?

c# - C++/CLI 中的 System::IntPtr 到 int*

C# 计时器在整秒开始