c# - 我们需要在 Controller 中使用 async/await 关键字吗?

标签 c# asynchronous async-await threadpool

我有一个这样的用户 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通过 Id 返回用户的方法.

我的问题是,我们是否需要使用 async/await controller 中的关键字或使用 async/awaitUserService够了吗?

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 方法的最后一行,并直接返回或根本不返回结果(即不对结果做任何重要的事情),然后yes,您可以通过删除 asyncawait 部分来省略 await;这避免了一些机械,但是这意味着如果你调用的方法同步(特别是:它抛出一个异常而不是返回一个报告错误的任务state),那么异常的表现会略有不同。

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

关于c# - 我们需要在 Controller 中使用 async/await 关键字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68177609/

相关文章:

c# - SQL插入命令只在一个循环中工作一次

Angular - 知道模板渲染何时完成 - 使用异步管道

swift - 异步调用全部成功或者都不成功,如何处理

javascript - 使用 Promise.all 从函数返回值

c# - 实现 AsyncCodeActivities(使用 C# async/await)

Python - 在 asyncio 中取消任务?

c# - 使用 async/await 时是否需要使字段线程安全?

c# - 按另一个列表过滤列表 C#

python-3.x - 如何确保按给定的顺序处理所有命令(和错误)

c# - 使用 C# 读取文本文件并访问部分输入