没有Await调用的Async/Await
本文关键字:Await Async 调用 没有 | 更新日期: 2023-09-27 18:05:47
我有一个虚拟方法,有时包含await调用,有时不包含。IDE确实给了我警告,什么是处理这个的正确方法?
在我的基类:
protected virtual async Task GoNext ()
从基类中通过await调用。
然后在我的子类中,我重写了这个方法,但有时它确实包含await,有时它不包含。
async
关键字实际上不是继承方法签名的一部分,而是向编译器发出的一个信号,它需要根据异步方法的模式编译和重写该方法。
因此,如果继承方法不使用await
关键字,则可以在继承方法上省略async
关键字。
注意,您仍然需要返回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;
}
}
警告如下:
警告:CS1998这个异步方法缺少'await'操作符,将同步运行。考虑使用
await
操作符来等待非阻塞API调用,或者使用await Task.Run(...)
操作符在后台线程上执行cpu绑定的工作。
但是,这不会产生警告:
class Derived : Base
{
public override Task<int> Method()
{
return Task.FromResult(42);
}
}
请注意,我在最后一个方法中更改了return
语句,因为async
关键字带来的部分"魔力"是自动将返回值包装在Task<T>
中。如果您有其他方法获得Task<T>
,显然您不需要像我上面那样包装结果。