我们需要在控制器中使用 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);
    }
}

是的,为了异步使用服务方法,您还需要使控制器异步。

这是“一路异步”...

https://docs.microsoft.com/en-us/archive/msdn-magazine/2013/march/async-await-best-practices-in-asynchronous-programming#async-all-the-way

如果您只等待一件事,作为 async 方法的最后一行,并直接返回结果或根本不返回结果(即不对结果做任何重要的事情),那么 您可以通过删除 asyncawait 部分来删除 await;这避免了一些机械操作,but 这意味着如果您调用的方法出错 同步(具体来说:它抛出异常而不是返回一个报告故障状态的任务),那么异常的表面会略有不同。

避免此状态机可能很重要如果您处于内部循环,例如在 IO 代码的中间,每个操作被调用多次,您需要优化它,但是:这在这里不适用 - 你在控制器的顶部。老实说,它不需要优化:只需使用 async/await:它会更一致地正确。