我的基类中有一个具有以下签名的方法。
public virtual async Task<TagBuilder> RenderAsync(int columnWidth)
{
// ...
}
这工作得很好,但是我有很多派生类重写了这个方法。其中一些覆盖不使用await
.
这给了我一个警告。
警告 CS1998 此异步方法缺少“await”运算符,并将同步运行。考虑使用“await”运算符等待非阻塞 API 调用,或使用“await Task.Run(...)”在后台线程上执行 CPU 密集型工作。
解决此警告的最佳方法是什么?首先,我不希望我的代码中到处都是警告。但我需要async
在基类中。我想以一种经过批准的方式解决这个问题,不会带来任何不必要的开销。
async
您可以从派生类中删除并使用返回值Task.FromResult()
根据:
衍生的:
这
async
是一个实现细节,不是方法签名的一部分。因此,基类中是否不需要它。您可以在基本方法中不带或不返回Task.FromResult((TagBuilder)null)
(或某些TagBuilder
对象) ,但添加到重写方法中。async
await
async
或者使基本方法抽象而不带
async
.让我用一个简化的编译代码示例来解释我的意图。考虑这些类:
await
Derived2.RenderAsync()
现在,即使它不是异步的,您仍然可以,并且不会在任何地方发出编译器警告:此示例表明基本方法不必是
async
. 您可以使用或不使用某些重写方法,并且async
仍然可以使用await
.最重要的是,要使一个方法可等待,只需将其设为
Task
or 即可Task<T>
。