*虚拟* 方法缺少 'await' return 值?

*Virtual* method lacks 'await' return value?

我有一个异步虚拟方法,它 returns 是我应用程序的某些基本功能中使用的默认布尔值。即如果没有设置要做,假设它是成功的。

我理解 非虚拟 方法上下文中的警告方法,但我想知道在 虚拟 方法。我应该在虚拟方法中返回什么以确保删除此警告?还是我应该忽略?

// WARNING: This async method lacks 'await'
// virtual is the differentiating factor here
protected virtual async Task<bool> SetupAsync()
{
    return true;
}

我知道您正在创建一个您希望被覆盖的 class,并且您想为 SetupAsync() 提供一个默认实现,它允许被覆盖的版本为 async

async 关键字不是方法签名的一部分,要覆盖方法必须复制该方法签名。只有 return 类型、参数和访问修饰符。

如果你的方法中没有异步代码,那么就不要使用async。如果你想允许覆盖版本为 async,那么你需要做的就是将其设为 return 为 Task.

在您的默认实现(同步运行)中,您只需使用 Task.FromResult.

return Task 中的一个值

例如:

class Test {
    protected virtual Task<bool> SetupAsync() {
        return Task.FromResult(true);
    }
}

class Test2 : Test {
    protected override async Task<bool> SetupAsync() {
        await Task.Delay(1000);
        return false;
    }
}

重写方法与方法的内部工作无关,而与它如何暴露给其他代码有关。任何代码都必须能够以与默认实现相同的方式调用重写的方法,而 async 关键字本身与此无关。

async 关键字仅允许在方法 中使用 await 。的确,使用 async 关键字需要 return 一个 Task 的方法,但事实上它是 returning 一个 Task 改变了其他代码与其交互的方式。