我们需要在控制器中使用 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 方法的最后一行,并直接返回结果或根本不返回结果(即不对结果做任何重要的事情),那么是的 你可以通过删除asyncawait 部分来省略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 && 茉莉花测试

async / await对异步的处理

在 web api 控制器(.net 核心)中使用 async/await 或任务

使用 Async/Await 控制哪些代码停止

理解 JavaScript 的 async/await