[英]Do async methods throw exceptions on call or on await?
当我调用异步方法并返回任务时,是否会立即抛出或等待我等待任务?
换句话说,这段代码会起作用吗? 或者我还必须在try-block中包装方法调用吗?
Task task = ThisMethodWillThrow();
try
{
await task;
}
catch (Exception e)
{
Console.WriteLine("oops");
}
两者都有可能。 如果该方法实际上是async
(即在声明中使用C# async
关键字),那么C#编译器会以一种总是可靠地抛出await
的方式将其包装起来,但重要的是要注意这不是编写一个可以await
的方法的唯一方法,所以:如果你不控制被调用的方法( 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() { ... }
可能很容易想到“好吧,只是让所有等待的方法async
,避免这种情况” - 如:
async Task ThisMethodWillThrowToo() { // note that this is "async"
if (thingsAreBad) throw new SomeException();
await SomeInnerMethod();
}
但是:在某些情况下,异步机制在“经常同步,有时是异步”的情况下是一个非常可测量的性能开销 - 因此,性能关键等待代码(例如IO /网络代码)中的常见优化是主动避免除非我们知道我们实际上属于异步路径,否则async
机制。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.