.Net 4.8 C#异步方法缺少await运算符的最佳实践咨询
异步方法缺少await警告的最佳处理方案
先看你提供的代码:
public class AuthorizationServiceProvider : OAuthAuthorizationServerProvider { public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext Context) { Context.Validated(); } }
这段代码触发警告的原因是:方法标记了async但内部没有使用await运算符,编译器会提示该方法会以同步方式运行,违背了异步方法的设计意图。
正确的最佳实践
不要添加无意义的伪逻辑(比如await Task.Delay(0)这类无效操作),推荐两种处理方式:
- 方式一:移除async关键字,返回已完成任务
如果当前方法确实不需要执行任何异步操作,直接去掉async,返回Task.CompletedTask(.NET 4.6及以上支持,你的.NET 4.8完全兼容),这是最简洁高效的方案:
public class AuthorizationServiceProvider : OAuthAuthorizationServerProvider { public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext Context) { Context.Validated(); return Task.CompletedTask; } }
- 方式二:保留async,await已完成任务
如果后续计划为该方法添加异步逻辑,暂时需要保留async关键字,可以通过await Task.CompletedTask消除警告,语义清晰且无性能损耗:
public class AuthorizationServiceProvider : OAuthAuthorizationServerProvider { public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext Context) { Context.Validated(); await Task.CompletedTask; } }
这两种方案都比添加伪逻辑更规范,前者更适合当前无异步需求的场景,后者为未来的异步扩展预留了空间。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

