我们需要在控制器中使用 async/await 关键字吗?
Posted
技术标签:
【中文标题】我们需要在控制器中使用 async/await 关键字吗?【英文标题】:Are we need to use async/await keyword in controller? 【发布时间】:2021-09-11 14:23:34 【问题描述】:我有一个这样的用户控制器:
public class UserController : ControllerBase
private readonly IUserService _userService;
public UserController(IUserService userService)
_userService = userService;
public async Task<User> Get(int id, CancellationToken cancellationToken)
return await _userService.GetUserById(id, cancellationToken);
和用户服务:
public class UserService : IUserService
public async Task<User> GetUserById(int id, CancellationToken cancellationToken)
return await _dbContext.Users.Where(a => a.Id == id).FirstOrDefaultAsync(cancellationToken);
在UserService
中,我有一个async
方法,通过Id
返回用户。
我的问题是,我们需要在controller
中使用async/await
关键字还是在UserService
中使用async/await
就足够了?
public class UserController : ControllerBase
private readonly IUserService _userService;
public UserController(IUserService userService)
_userService = userService;
public Task<User> Get(int id, CancellationToken cancellationToken)
return _userService.GetUserById(id, cancellationToken);
【问题讨论】:
确认:顶部的UserController.Get
版本与底部的版本之间存在问题吗?即我们可以省略await
吗?
@MarcGravell 我更新了我的问题
必读:Eliding Async and Await
【参考方案1】:
如果您只等待一件事,作为async
方法的最后一行,并直接返回结果或根本不返回结果(即不对结果做任何重要的事情),那么是的 你可以通过删除async
和await
部分来省略await
;这避免了一些机械问题,但是这意味着如果你调用的方法同步出错(特别是:它抛出一个异常而不是返回一个报告错误的任务state),那么异常的表现会略有不同。
避免这个状态机可能很重要如果你在一个内部循环中,例如在每个操作被多次调用的 IO 代码中间,你需要优化它,但是:这不适用于此处-您位于控制器的顶部。老实说,它不需要优化:只需使用async
/await
:它会更一致地正确。
【讨论】:
【参考方案2】:是的,为了异步使用服务方法,您还需要使控制器异步。
这是“一路异步”...
https://docs.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming#async-all-the-way
【讨论】:
你不需要;它可能首选;这些是不同的东西以上是关于我们需要在控制器中使用 async/await 关键字吗?的主要内容,如果未能解决你的问题,请参考以下文章
async / await 如何在 ASP.Net 应用程序中提供帮助?
Angular 1.5 && Async/Await && 茉莉花测试