如何正确解决警告CS1998:此异步方法缺少“await”(而不是抑制它)?

3

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

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

然后,我有一个实现RealDataService : IDataService,它执行一些文件的写入/读取操作,并且由于它使用异步I/O方法,它们被调用时带上await,并且方法签名被更改为async Task<DataModel> GetData()

然后,从UI中使用var data = await _dataService.GetData();进行调用。到这里都很好。

但是,我需要测试我的数据,因此我创建了另一个数据接口的实现MockupDataService : IDataService,其中数据仅为硬编码,没有执行任何异步操作。一切仍然按预期工作,但是在构建应用程序时会出现那些讨厌的CS1998警告。

在线上可以找到很多解决此问题的方法:

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

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


2
模拟服务内的方法不需要是async,移除该修饰符,并使用return Task.FromResult<DataModel>(new DataModel());返回。 - undefined
2个回答

8
如果没有await,请删除async关键字。 async不会使一个方法变成异步的。它不是方法签名的一部分。它只是语法糖,允许使用await来等待已经在执行的异步操作而不会阻塞。
在您的测试方法中,使用Task.FromResult创建一个已经完成的任务,并将其原样返回:
public Task<DataModel> GetData()
{
    var model=new DataModel();
    //Add some test data
    return Task.FromResult(model);
}

如果您没有返回类型(例如简单的“Task”),则可以使用“Task.CompletedTask”。 - undefined

7

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接