猿问

*虚拟*方法缺少“await”;返回值?

我有一个异步虚拟方法,它返回一个默认布尔值,该布尔值在我的应用程序的某些基本功能中使用。即,如果没有需要进行的设置,则假设它已成功。


我理解非虚拟方法上下文中的警告方法,但我想知道实现的最佳方法这是一个 虚拟 方法。我应该在虚拟方法中返回什么以确保删除此警告?或者我应该忽略?


// WARNING: This async method lacks 'await'

// virtual is the differentiating factor here

protected virtual async Task<bool> SetupAsync()

{

    return true;

}


慕无忌1623718
浏览 116回答 1
1回答

慕森卡

我了解您正在创建一个希望被重写的类,并且您希望为 SetupAsync() 提供默认实现,以允许重写版本async.async 关键字不是方法签名的一部分,必须复制方法签名才能覆盖方法。只有返回类型、参数和访问修饰符。如果您的方法中没有异步代码,则不要使用async。如果您想允许覆盖版本为 async,那么您所需要做的就是让它返回 Task。在默认实现(同步运行)中,您只需使用 在 Task 中返回一个值。Task.FromResult例如:class Test {&nbsp; &nbsp; protected virtual Task<bool> SetupAsync() {&nbsp; &nbsp; &nbsp; &nbsp; return Task.FromResult(true);&nbsp; &nbsp; }}class Test2 : Test {&nbsp; &nbsp; protected override async Task<bool> SetupAsync() {&nbsp; &nbsp; &nbsp; &nbsp; await Task.Delay(1000);&nbsp; &nbsp; &nbsp; &nbsp; return false;&nbsp; &nbsp; }}重写方法与该方法的内部工作原理无关,而是与该方法如何暴露给其他代码有关。任何代码都必须能够以与默认实现相同的方式调用重写的方法,并且 async 关键字本身与此没有任何关系。async 关键字仅允许在方法内使用 。确实,使用 关键字需要方法返回 ,但事实上它是 返回 会改变其他代码与其交互的方式。await asyncTaskTask
随时随地看视频慕课网APP
我要回答