我有一个虚拟方法,有时包含等待调用,有时不包含.IDE确实给了我警告,处理这个问题的正确方法是什么?
在我的基类:
protected virtual async Task GoNext ()
Run Code Online (Sandbox Code Playgroud)
从基类开始,它通过await调用.
然后在我的子类中,我重写了这个方法,但有时候它确实包含了await和它没有的时间.
ang*_*son 11
该async关键字实际上不是继承方法签名的一部分,而是更多的编译器信号,它需要根据异步方法的模式编译和重写方法.
因此,async如果继承的方法不使用await关键字,则可以在继承的方法上省略关键字.
请注意,您仍然必须返回一个Task或Task<T>,该部分是继承方法签名的一部分.
所以这会给你一个警告:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
警告是这样的:
警告:CS1998此异步方法缺少'await'运算符并将同步运行.考虑使用
await运算符等待非阻塞API调用,或者await Task.Run(...)在后台线程上执行CPU绑定工作.
但是,这不会产生警告:
class Derived : Base
{
public override Task<int> Method()
{
return Task.FromResult(42);
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,我return在最后一个方法中更改了语句,因为async关键字带来的"魔法"的一部分是自动将返回值包装在a中Task<T>.如果你有其他方法可以获得a Task<T>,显然你不需要像上面那样包装结果.
| 归档时间: |
|
| 查看次数: |
1646 次 |
| 最近记录: |