没有Await调用的Async/Await

本文关键字:Await Async 调用 没有 | 更新日期: 2023-09-27 18:05:47

我有一个虚拟方法,有时包含await调用,有时不包含。IDE确实给了我警告,什么是处理这个的正确方法?

在我的基类:

protected virtual async Task GoNext ()

从基类中通过await调用。

然后在我的子类中,我重写了这个方法,但有时它确实包含await,有时它不包含。

没有Await调用的Async/Await

async关键字实际上不是继承方法签名的一部分,而是向编译器发出的一个信号,它需要根据异步方法的模式编译和重写该方法。

因此,如果继承方法不使用await关键字,则可以在继承方法上省略async关键字。

注意,您仍然需要返回TaskTask<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>,显然您不需要像我上面那样包装结果。