异步方法在调用或等待时抛出异常吗?

2024-02-08

当我调用异步方法并取回任务时,它会立即抛出还是会等到我等待任务?

换句话说,这段代码能工作吗?或者我是否也必须将方法调用包装在 try 块中?

Task task = ThisMethodWillThrow();

try
{
    await task;
}
catch (Exception e)
{
    Console.WriteLine("oops");
}

两者皆有可能。如果该方法实际上是async(即使用 C#async声明中的关键字),然后 C# 编译器将其包装起来,使其始终可靠地抛出await,但值得注意的是,这是not编写可以的方法的唯一方法await-ed,所以:如果你不控制被调用的方法(ThisMethodWillThrow)并且不能依赖于实现的知识,这对于try包括初始调用以及await.

作为将立即抛出而不是在中抛出的方法的示例await:

Task ThisMethodWillThrow() { // note that this is **not** "async", but is awaitable
    if (thingsAreBad) throw new SomeException();
    return SomeInnerMethod();
}
async Task SomeInnerMethod() { ... }

It might很容易想到“好吧,只要让所有等待的方法async,以避免这种情况” - 例如:

async Task ThisMethodWillThrowToo() { // note that this is "async"
    if (thingsAreBad) throw new SomeException();
    await SomeInnerMethod();
}

然而:在某些情况下,异步机制在“经常同步,有时异步”的情况下是一个非常可衡量的性能开销 - 因此,性能关键的可等待代码(例如 IO/网络代码)的常见优化是积极回避 the async除非我们知道我们实际上陷入了异步路径。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

异步方法在调用或等待时抛出异常吗? 的相关文章

随机推荐