当我调用异步方法并取回任务时,它会立即抛出还是会等到我等待任务时才开始?
换句话说,此代码行得通吗?还是我也必须将方法调用包装在try块中?
Task task = ThisMethodWillThrow();
try
{
await task;
}
catch (Exception e)
{
Console.WriteLine("oops");
}
两者都有可能。如果该方法是实际的async
(即async
在声明中使用C#关键字),则C#编译器将其包装为始终可靠地抛出的方式await
,但要注意的是,这并非唯一的方法编写一个可以被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() { ... }
它可能会被容易让人联想到“好,只是让所有awaitable方法async
,避免这种” -这样的:
async Task ThisMethodWillThrowToo() { // note that this is "async"
if (thingsAreBad) throw new SomeException();
await SomeInnerMethod();
}
但是:有场景中的异步机器是在一个非常可测量的性能开销“经常同步,有时异步”的情况下-并因此在性能关键awaitable代码共同优化(IO /网络代码,例如)是积极地避免了async
机器,除非我们知道我们实际上陷入了异步路径。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句