如何正确实现无await的async签名GetArticle同步方法?
解决同步实现异步接口方法的警告问题
当你的类需要实现一个定义了async方法的接口,但该实现实际是同步逻辑时,直接加async关键字却不用await会触发「方法将同步运行」的警告,正确的处理方式如下:
正确的同步实现方式
去掉方法的async修饰符,直接通过Task.FromResult包装同步计算的结果返回,这样既符合接口的Task<Article>返回类型约定,又能消除编译器警告,同时避免不必要的异步状态机开销:
public Task<Article> GetArticle(int articleId) { var article = _articles.Where(a => a.ArticleId == articleId).FirstOrDefault(); return Task.FromResult(article); }
补充说明
- 接口定义的是返回
Task<Article>,而非强制要求方法必须用async修饰——async只是C#提供的异步语法糖,只要返回值满足Task类型即可。 - 如果同步逻辑可能抛出异常,不要直接抛出(会导致同步异常,不符合异步方法的异常处理预期),应该用
Task.FromException<Article>包装异常返回:public Task<Article> GetArticle(int articleId) { try { // 可能抛出异常的同步逻辑 var article = _articles.Where(a => a.ArticleId == articleId).Single(); return Task.FromResult(article); } catch (InvalidOperationException ex) { return Task.FromException<Article>(ex); } }
内容的提问来源于stack exchange,提问作者Val
相关产品推荐
相关产品推荐

