c# - 我们需要在控制器中使用 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/await
inUserService
就足够了?
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
方法的最后一行,并直接或根本不返回结果(即不对结果做任何不重要的事情),那么是的,您可以await
通过删除 ,async
和await
部分; 这避免了一些机械问题,但这意味着如果您正在调用的方法同步出错(特别是:它抛出异常而不是返回报告故障状态的任务),那么异常的表面会略有不同。
如果您处于内部循环中,则避免此状态机可能很重要,例如在每个操作多次调用的 IO 代码中间,您需要对其进行优化,但是:这不适用于这里 - 您是在控制器的顶部。老实说,它不需要优化:只需使用async
/ await
:它会更一致地正确。
推荐阅读
- python - 为什么在 Spacy 中,低于 20 的拼写数字被视为停用词?
- swift - 在 TableView Swift 中识别用户关注的人
- python - 根据 Python 中的列分组绘制 DataFrame
- c++ - 更清晰地将变量分配给 unsigned char 数组的当前索引
- node.js - 将JSON对象添加到可查询的redis中-nodejs
- java - 在 Java 中实例化对象
- reactjs - 在 react-redux 应用程序中从 firebase 检索数据
- python - 为什么我的 SQL 数据表代码不能在 Pycharm 中编译(在 python 3 中编译)
- java - Spring 对 Spring 数据的不满意依赖
- autodesk-forge - 如何使用 Forgeviewer 查看点云数据的 NWD