Async/Await没有等待呼叫

Len*_*nie 7 c# async-await

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

在我的基类:

protected virtual async Task GoNext ()
Run Code Online (Sandbox Code Playgroud)

从基类开始,它通过await调用.

然后在我的子类中,我重写了这个方法,但有时候它确实包含了await和它没有的时间.

ang*_*son 11

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

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

请注意,您仍然必须返回一个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;
    }
}
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>,显然你不需要像上面那样包装结果.