如何正确解决警告 CS1998:此异步方法缺少“等待”(不压制它)?

Den*_*tez 0 c# asynchronous visual-studio async-await xamarin.forms

我在我的应用程序中收到很多 CS1998 警告,我正在寻找如何在我的情况下解决它们。

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

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

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

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

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

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

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

Dan*_*ite 7

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


Pan*_*vos 5

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

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

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