首页 > 解决方案 > 我们需要在控制器中使用 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返回用户的方法Id

我的问题是,我们需要使用async/await关键字 incontroller还是使用async/awaitinUserService就足够了?

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);
    }
}

标签: c#asynchronousasync-awaitthreadpool

解决方案


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

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


推荐阅读