【问题标题】:return await Task.FromResult or suppress warning? [duplicate]返回 await Task.FromResult 还是禁止警告? [复制]
【发布时间】:2019-03-01 07:10:51
【问题描述】:

我们有一个返回类型为async Task<> 的旧方法。它当前的实现需要查询数据库,因此需要异步操作。但是我们将其更改为仅使用内存中的对象,因此基本上我们不再需要在实现中进行异步操作,但我不想更改方法的签名以不破坏该方法的任何调用者。

现在,我应该将实现包装在 await Task.FromResult 中,还是应该不使用任何 await 并直接取消警告?

【问题讨论】:

  • 今天早上我问自己这个确切的问题。我有点惊讶,甚至对此有警告。如果性能是一个问题,你会想要避免不必要的await,否则我认为这样做不会有很大的问题
  • 嗨,保罗,我建议使用await Task.FromResult,因为在执行异步操作时它一直是异步的(这很好)。仍然不会有任何影响,因为任务将立即返回您想要的响应。通过这种方式,您不会修改当前的抽象(或方法签名),并且“如果”对所采取的方法(例如查询数据库或从其他服务)进行了更改,您只需要实现该部分。
  • @Cheranga "async all way" 意味着你所有的调用链都应该返回任务,而不是你必须使用async关键字
  • 我更正了我的评论,重复的。删除 async 并返回 Task.FromResult
  • @CamiloTerevinto 一个完全合理的理由是为了保持一致性

标签: c# async-await


【解决方案1】:

普遍接受的方式以及在 Microsoft 文档中主要使用的方式是删除 async 关键字和 return Task.FromResult。如果方法不需要返回类型(显然是 Task 除外),请使用 Task.CompletedTask

【讨论】:

  • 因此可以安全地假设删除 async 关键字不会破坏该方法的任何调用者?
  • @PaoloGo 是的,它是安全的。 async标记当前方法,客户端无法知道该方法是否标记async
  • 是的。在幕后,在这种情况下,异步在功能上等同于返回一个任务。
  • 有一个行为变化需要注意:如果您在async 方法中抛出异常,它将被捕获并返回错误任务。如果您删除 async 关键字,则异常将像“普通”方法一样传播。这通常不是问题,但需要牢记
  • @PaoloGo:是的,这是编译器的事情。 async 向编译器发出信号,表明该方法中允许(实际上是预期的)await,并导致编译器将方法主体重写为异步工作流。它对方法的签名没有任何作用。
猜你喜欢
  • 2010-09-13
  • 2015-01-09
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-03
相关资源
最近更新 更多