我们需要在控制器中使用 async/await 关键字吗?
Are we need to use async/await keyword in controller?
我有一个这样的用户控制器:
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
方法,return 一个用户 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);
}
}
是的,为了异步使用服务方法,您还需要使控制器异步。
这是“一路异步”...
如果您只等待一件事,作为 async
方法的最后一行,并直接返回结果或根本不返回结果(即不对结果做任何重要的事情),那么是 您可以通过删除 async
和 await
部分来删除 await
;这避免了一些机械操作,but 这意味着如果您调用的方法出错 同步(具体来说:它抛出异常而不是返回一个报告故障状态的任务),那么异常的表面会略有不同。
避免此状态机可能很重要如果您处于内部循环,例如在 IO 代码的中间,每个操作被调用多次,您需要优化它,但是:这在这里不适用 - 你在控制器的顶部。老实说,它不需要优化:只需使用 async
/await
:它会更一致地正确。
我有一个这样的用户控制器:
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
方法,return 一个用户 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);
}
}
是的,为了异步使用服务方法,您还需要使控制器异步。
这是“一路异步”...
如果您只等待一件事,作为 async
方法的最后一行,并直接返回结果或根本不返回结果(即不对结果做任何重要的事情),那么是 您可以通过删除 async
和 await
部分来删除 await
;这避免了一些机械操作,but 这意味着如果您调用的方法出错 同步(具体来说:它抛出异常而不是返回一个报告故障状态的任务),那么异常的表面会略有不同。
避免此状态机可能很重要如果您处于内部循环,例如在 IO 代码的中间,每个操作被调用多次,您需要优化它,但是:这在这里不适用 - 你在控制器的顶部。老实说,它不需要优化:只需使用 async
/await
:它会更一致地正确。