【问题标题】:C# - What happens to a Task that throws an exception but the caller method is already done?C# - 引发异常但调用方方法已经完成的任务会发生什么?
【发布时间】:2015-10-29 20:14:49
【问题描述】:

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

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

异常会被捕获吗?由谁?

【问题讨论】:

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


【解决方案1】:

如果Bar 抛出异常,它会在你调用它的地方直接抛出。

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

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

【讨论】:

【解决方案2】:

不,异常不会被捕获。您需要专门为Task 添加一个延续(请注意,当您await 一个任务时,您正在为其添加延续)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-14
    • 2013-07-13
    • 1970-01-01
    • 2019-01-20
    • 2020-11-07
    相关资源
    最近更新 更多