如何在Task awaiter中处理未处理的异常

时间:2014-05-13 09:53:40

标签: c# exception asynchronous task

我遇到了在任务中抛出未处理异常的问题。 这些异常只会被忽略,并且永远不会在任何地方传播。

代码示例:

Task<bool> Execute()
{
    TaskCompletionSource<bool> tcsrc = new TaskCompletionSource<bool>();
    Task.Delay(50).ContinueWith((t) => {
        tcsrc.SetResult(true);
    });
    return tcsrc.Task;
}

async Task<bool> Test()
{
    bool result = await Execute();
    throw new Exception("test");
    return result;
}

在此示例中,Test()等待Execute()返回的任务,然后抛出异常。 这个异常永远不会在任何地方处理,我能够捕获它的唯一地方是Application的FirstChanceException处理程序。执行此处理程序后,异常将被忽略。

Test()本身是通过来自某个UI事件处理程序的异步调用链调用的。 所以我认为它应该传播到那个UI事件处理程序并抛出。但它永远不会发生。

有什么我错过的吗?

编辑:根据FirstChanceException处理程序,在使用以下堆栈跟踪忽略之前,异常会重现三次:

at Microsoft.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)

1 个答案:

答案 0 :(得分:2)

Task<bool>方法返回的Test将出现故障。如果您等待该任务(或在其上调用Wait()),那么将在该点重新抛出该异常。如果您选择忽略任务的故障状态,那么是的,您将忽略该异常。