我是否需要始终在异步代码流中已有的方法中使用异步/等待?

时间:2019-10-14 09:39:16

标签: .net async-await

假设我已经在异步方法中,并且将等待嵌套方法的结果:

var x = await CallMethodAsync();

然后,假设您可以选择通过以下两种方式之一编写CallMethodAsync:

public Task<int> CallMethodAsync() {
     var y = DoStuff();
     return _dependency.CallAnotherMethodAsync(y);
 }

或:

public async Task<int> CallMethodAsync() {
    var y = DoStuff();
    return await _dependency.CallAnotherMethodAsync(y);
}

有区别吗?在CallMethodAsync方法定义中添加async / await语法是否有意义?

1 个答案:

答案 0 :(得分:3)

差异是细微的,并且主要是在以下两者之间进行权衡:

  • 如果在CallAnotherMethodAsync的异步部分
  • 之前引发异常,则会获得略微不同的异常语义
  • CallMethodAsync中更少的开销(分配等)

就个人而言,如果所有以下条件,我倾向于在这里没有await

  • return [await]是最后一个操作
  • 我们不需要转换或检查返回的值

但这是一个稍微主观的情况。您的选择还可能取决于此代码路径的“热”程度。如果它是高吞吐量的IO循环,则可能避免使用await;如果数量较少,请付出代价以获取更清晰的异常语义。