【问题标题】:How to properly resolve warning CS1998: This async method lacks 'await' (without surpressing it)? [duplicate]如何正确解决警告 CS1998:此异步方法缺少“等待”(不压制它)? [复制]
【发布时间】:2019-11-21 06:52:15
【问题描述】:

我在我的应用程序中收到很多 CS1998 警告,我正在研究如何解决这些问题。

例如,我有一个具有方法签名Task<DataModel> GetData() 的 IDataService 接口。

然后我可以说一个RealDataService : IDataService 的实现,它可以对文件进行一些写入/读取,并且由于它使用异步 I/O 方法,因此它们使用await 调用,并且方法签名更改为async Task<DataModel> GetData()

然后使用 var data = await _dataService.GetData(); 从 UI 调用它。到目前为止一切都很好。

但是我需要测试我的数据并创建数据接口MockupDataService : IDataService 的另一个实现,其中数据只是硬编码并且不执行异步操作。一切仍然正常运行,但那些讨厌的 CS1998 警告在构建应用程序时开始出现。

这个问题网上有很多解决办法:

  • 禁用此类警告
  • 使用await Task.Yeild();的调用
  • 使用 Task.From 结果 -> return await Task.FromResult<DataModel>(new DataModel());
  • 我想我见过更多,但现在想不起来了。

但是这些解决方案都没有比其他解决方案“更正确”,所以我想知道解决这个问题的正确方法是什么?我知道很多人对 C# 中的异步编程有更深入的了解,并且能够就这个问题提供一些见解/答案。

【问题讨论】:

  • 模拟服务中的方法不需要是async,去掉那个修饰符然后做return Task.FromResult<DataModel>(new DataModel());

标签: c# visual-studio asynchronous xamarin.forms async-await


【解决方案1】:

如果没有await,请删除async 关键字。 async 不会使方法异步。它不是方法签名的一部分。它只是一种语法糖,它允许使用await等待一个已经执行的异步操作而不会阻塞。

在您的测试方法中,使用Task.FromResult 创建一个已完成的任务并按原样返回:

public Task<DataModel> GetData()
{
    var model=new DataModel();
    //Add some test data
    return Task.FromResult(model);
}

【讨论】:

    【解决方案2】:

    从方法中删除 async 关键字。然后使用return Task.FromResult(...)

    【讨论】:

      猜你喜欢
      • 2012-10-25
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 1970-01-01
      • 2017-04-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多