【发布时间】:2018-10-03 16:00:14
【问题描述】:
考虑如下界面:
public interface IProvider
{
Task<bool> Contains(string key);
}
这是满足 Visual Studio 的实现
public Task<bool> Contains(string key)
{
return Task.FromResult(false);
}
这个实现写起来很方便,而且似乎可以达到同样的效果:
public async Task<bool> Contains(string key)
{
return false;
}
然而,Visual Studio 却不以为然,坚持认为:
此异步方法缺少“等待”运算符,将同步运行。考虑使用 'await' 运算符来等待非阻塞 API 调用,或使用 'await TaskEx.Run(...)' 在后台线程上执行 CPU 密集型工作。
我很乐意忽略该警告并避免使用Task.FromResult(...)。
使用后一个选项有什么负面影响吗?
【问题讨论】:
-
为什么?使用
Task.FromResult()是正确的调用,因为您的代码不 异步执行任何操作。async不会让某些东西异步运行,它只是语法糖,允许您await已经异步操作。使用async只是为了返回false并不方便,它比简单地返回Task<bool>实例更详细。 -
顺便说一句,这段代码有什么意义?如果您不打算异步运行任何东西,为什么要使用任务?为什么不写一个
public bool Contains(..)? -
您的第一个实现只返回一个
Task<TResult> and does noting asynchronous.。您的第二个实现标有async,并且您没有执行任何异步运行任务。当然,您会收到警告。顺便说一句:您的界面和方法的参数数量不同。你确定你实现了这个接口吗? -
@PanagiotisKanavos:我认为这是
Task.FromResult的用例。当接口允许异步调用者,但实现是同步的。 -
@PanagiotisKanavos - 如果其他人定义了
IProvider并且您正在尝试实现它,您将没有太多选择。
标签: c# asynchronous async-await