传递异步方法真的需要等待/异步模式吗? [复制]

Posted

技术标签:

【中文标题】传递异步方法真的需要等待/异步模式吗? [复制]【英文标题】:Does a pass-through async method really need the await/async pattern? [duplicate] 【发布时间】:2017-07-04 13:40:33 【问题描述】:

假设我有一个方法可以立即或类似地调用另一个异步方法:

//Main method
public async Task<int> Foo1( int x )

     var result = await DoingSomethingAsync(x );
     return DoSomethingElse(result );
  
//other method
public async Task<int> Foo2( Double double )

     return await Foo1( Convert.ToInt32(double ) );
  

Foo2 需要/应该有 async/await,而不是简单地调用:

//other method
public Task<int> Foo3( Double double )

     return Foo1( Convert.ToInt32( double ) );
  

在消费者中,这仍然会被等待,就像这样,不管:

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

所有这些语句都将编译。编译器会不会为两种不同的方法生成不同的IL?

【问题讨论】:

【参考方案1】:

这取决于。特别是如果Convert.ToInt32 throws,异常行为是不同的。

我有一个完整的blog post on the subject,但总的来说,我会在这里使用async/await,因为异常会放在返回的任务上。否则直接抛出异常。

直接抛出异常仅适用于前置条件异常(即,传递无法转换为 int 的 double 是违反 API 的)。即使这样(对于前置条件异常),您也可以选择直接抛出异常或将它们放在返回的任务上。

【讨论】:

以上是关于传递异步方法真的需要等待/异步模式吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如果我不关心它的返回值,我应该等待一个“异步任务”函数吗? [复制]

我可以检测到浏览器中可用的异步/等待吗? [复制]

可以使用 Task.WhenAll(...) 或其他比每次等待更有意义的东西重写此异步/等待代码吗? [复制]

如果javascript“异步”函数的主体中没有“等待”,它会以任何不同的方式执行吗? [复制]

异步/等待线程安全与内存缓存

Mariadb的半同步复制