c# -如果Task抛出了一个异常,但是调用者的方法已经完成了,会发生什么?

本文关键字:方法 调用者 什么 Task 异常 一个 如果 | 更新日期: 2023-09-27 18:06:54

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

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

异常会被捕获吗?由谁?

c# -如果Task抛出了一个异常,但是调用者的方法已经完成了,会发生什么?

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

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

然而,如果Bar返回的Task包装了一个异常,会发生什么取决于你的。net运行时版本-对于。net 4.0,它会降低你的整个进程,因为它最终导致异常被抛出在终结器线程(或线程池线程)。对于。net 4.5+,异常将被静默处理。

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