一个经过传递的异步方法真的需要 await/async 模式吗?

14 浏览
0 Comments

一个经过传递的异步方法真的需要 await/async 模式吗?

假设我有一个立即调用另一个异步方法的方法:\n

//主方法
public async Task Foo1(int x)
{
     var result = await DoingSomethingAsync(x);
     return DoSomethingElse(result);
}
//其他方法
public async Task Foo2(double double)
{
     return await Foo1(Convert.ToInt32(double));
}

\n有没有任何特定的原因要求/应该在`Foo2`中使用`async/await`,而不是简单地调用:\n

//其他方法
public Task Foo3(double double)
{
     return Foo1(Convert.ToInt32(double));
}

\n在使用者端,不论如何都会等待,如下所示:\n

int x = await Foo1(1);
int x = await Foo2(1D);
int x = await Foo3(1D);

\n所有这些语句都会编译。编译器会为这两种不同的方法生成不同的中间语言(IL)吗?

0
0 Comments

异步方法是通过使用await/async模式来实现的,但是这种模式在某些情况下并不是必需的。具体来说,如果Convert.ToInt32引发异常,异常的行为将会有所不同。

Stephen Cleary在他的博客文章中详细介绍了这个问题,但总结起来,我认为在这种情况下应该使用async/await,因为异常将会被放置在返回的任务上。否则,异常将会直接抛出。

直接抛出异常只适用于前置条件异常(即,传递给方法的double类型参数无法转换为int类型是API的违规)。即使对于前置条件异常,你也可以选择直接抛出异常或将异常放置在返回的任务上。

0