我有一个虚拟方法,有时包含等待调用,有时不包含。 IDE确实给了我警告,处理这个问题的正确方法是什么?
在我的基类中:
protected virtual async Task GoNext ()
从基类中通过await调用它。
然后在我的子类中,我重写了这个方法,但有时候它确实包括await和它没有的时间。
答案 0 :(得分:11)
strip()
关键字实际上不是继承方法签名的一部分,而是编译器需要根据异步方法的模式编译和重写方法的更多信号。
因此,如果继承的方法不使用async
关键字,则可以在继承的方法上省略async
关键字。
请注意,您仍然必须返回await
或Task
, 部分是继承方法签名的一部分。
所以这会给你一个警告:
Task<T>
警告是这样的:
警告:CS1998此异步方法缺少等待&#39;运营商并将同步运行。考虑使用
class Base { public virtual async Task<int> Method() { await Task.Delay(10); return 42; } } class Derived : Base { // next line produces warning public override async Task<int> Method() { return 42; } }
运算符等待非阻塞API调用,或await
在后台线程上执行CPU绑定工作。
然而,这不会产生警告:
await Task.Run(...)
请注意,我在最后一个方法中更改了class Derived : Base
{
public override Task<int> Method()
{
return Task.FromResult(42);
}
}
语句,因为&#34; magic&#34; return
关键字带来的是自动将返回值包装在async
内。如果你有其他方法可以获得Task<T>
,显然你不需要像上面那样包装结果。