【问题标题】:Second implementation of async task without await没有等待的异步任务的第二次实现
【发布时间】:2020-02-23 19:23:36
【问题描述】:

当我有一个接口返回任务 (void) 但其中一个实现没有异步操作时,我该怎么办?

我的接口IDatabaseService有两个实现:FirestoreDatabaseServiceCacheDatabaseServiceFirestoreDatabaseService 使用方法 async Task AddResult(ResultDto result) 作为方法的结果是有意义的,但 CacheDatabaseService只有一个列表,不需要等待,基本上是一个void方法。

我收到警告“警告 CS1998 此异步方法缺少 'await' 运算符,将同步运行。考虑使用 'await' 运算符等待非阻塞 API 调用,或 'await Task.Run(...)' " 当我在 CacheDatabaseService 异步中实现该方法时。如果我删除异步,我必须返回一个任务,但 Task.FromResult 不适用于 void 任务。

【问题讨论】:

  • return Task.CompletedTask;(尽管Task.FromResult(false) 也可以,因为Task<T> : Task
  • 这只是警告,您可以选择忽略它!
  • 感谢您的回答,Task.CompletedTask 是我一直在寻找的。 @phuzi 我不再忽略警告,总是让它们出错。

标签: c# asynchronous async-await


【解决方案1】:

这个警告几乎总是意味着你的方法不应该是async

async 关键字实际上只允许使用await。所以如果你不使用await,你就不需要async

如果AddResult 必须返回Task,则返回Task。如果您实际上没有做任何异步操作,那么您可以返回 Task.CompletedTask

例如:

public Task AddResult(ResultDto result) {
    ...
    return Task.CompletedTask;
}

如果你必须返回一个值(Task<T>),那么你可以使用Task.FromResult()

指定方法应返回Task 的接口只是一种可能 方法async 的方法。这并不意味着必须。

【讨论】:

  • 我相信方法名称是AddResultFirestoreDatabaseService 是使用异步方法的类的名称。
  • 是的,但是这个概念有效——我一直在寻找那个。我会尽快将此答案标记为已接受的解决方案。非常感谢!
  • 令人毛骨悚然的是,我经常去寻找答案,却从来自同一源材料的问题中找到答案。在我的例子中,它是一个与 Firebase 相关的 IHostedService——它需要一个异步 StartAsync() 方法。但是我没有任何异步可以在其中实现。欣赏这里提出的问题和答案!
猜你喜欢
  • 1970-01-01
  • 2012-11-15
  • 2014-05-13
  • 2015-10-06
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
  • 2014-09-06
  • 2013-02-10
相关资源
最近更新 更多