异步方法是在调用时还是在等待时抛出异常?

霍夫

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

换句话说,此代码行得通吗?还是我也必须将方法调用包装在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Junit强制在方法调用时抛出异常

未通过await调用时在异步方法中捕获异常

异步/等待的调用链...等待等待还是返回等待?

在每次函数调用时检查并抛出异常

等待异步函数时是否需要显式捕获并重新抛出异常?

调用Spring数据方法时抛出奇怪的异常

传播的异步/等待方法调用

等待带有动态参数的方法时抛出异常(有时)

NullPointerException将在方法调用时抛出

从C#代码调用时查询抛出异常

NavigationService.Navigate 在 UWP 的 Prism 中调用时抛出异常

使用 Xamarin MessagingCenter 调用异步方法时如何处理异步和等待?

ClassCast异常:子类实现在调用超类方法时抛出异常

等待任务抛出异常

异步和等待调用者不是异步但被调用的方法是

抛出异常还是阻止异常?

等待异步方法中的回调被调用

调用方法异步而不等待应答

如何同步调用异步(等待)方法?

查找未等待的异步方法调用

异步等待方法在调用控制器操作方法时不能并行工作

枚举的JNI调用方法抛出异常

调用重写方法抛出经过检查的异常

等待/异步异常行为

在.net核心中调用外部服务时,如何等待异步方法完成?

在ASP.NET MVC5中调用异步方法时无法等待'long'

异步等待调用aync方法时返回Task <List <T >>而不是List <T>

在异步方法的结尾,我应该返回还是等待?

在异步/等待中调用异步方法和TaskScheduler