C# - 抛出异常但调用方法已经完成的任务会发生什么?

时间:2015-08-06 15:29:19

标签: c# .net async-await task-parallel-library

如果满足以下if语句并且Bar()抛出异常会发生什么(以及为什么)?

    async Task Foo()
    {
        Task<object> myTask = Bar();
        if (condition)
        {
            return;
        }
        else
        {
            await myTask;
            // ....
            return;
        }
    }

是否会发现异常?由谁?

2 个答案:

答案 0 :(得分:5)

不,这个例外不会被抓住。您需要专门为Task添加续集(请注意,当您await任务时,您需要为其添加续集。

答案 1 :(得分:4)

如果Bar抛出异常,它将在您调用它时被抛出。

但是,如果Task返回包含异常的Bar,会发生什么取决于您的.NET运行时版本 - 对于.NET 4.0,它会降低整个过程,因为它最终会导致在终结器线程(或线程池线程)上抛出异常。对于.NET 4.5+,异常将被静默处理。

无论如何,你也不想要。您应该始终显式处理可以在异步任务中传播的任何异步异常。如果您不想在代码的某个分支中await执行该任务(例如,您预先加载了认为您需要的数据,但是,不要在任务上绑定一个延续,以优雅地处理任何可能的异常。