【发布时间】:2021-08-03 08:51:32
【问题描述】:
我想使用 .NET Core 构建异步 Web API
如果我有 async Task 正在等待来自服务的结果,如下所示
[HttpGet("User/")]
public async Task<IActionResult> GetUser()
{
var result = await _service.GetUser();
return Ok(result);
}
现在在_service.GetUser 中,我们执行不止一项任务,例如多次查询数据库。
所以我的问题是我们是否必须在 _service.GetUser 中也使用 async 和 await,或者调用者方法是否足够?我有点困惑。
public async Task<UserResponseDTO> GetUser(UserRequestDTO userRequestDTO)
{
var userId = await _utilities.getUserId(); //shall we use it?
var user = await _dbContext.getFullUserInfo //shall we use it?
.Where(P => P.userId == userId).FirstOrDefault();
if (!string.IsNullOrEmpty(userRequestDTO.email))
{
var emailExists = await _dbContext.getFullUserInfo.Where(p =>
p.Email == userRequestDTO.email).AnyAsync(); //shall we use it?
}
await _dbContext.SaveChangesAsync();
return _mapper.Map<UserResponseDTO>(user);
}
【问题讨论】:
-
您应该从所调用方法的顶部到底部一直执行 async/await,因此将
GetUser设为 async 并等待其中的 async 调用是正确的。虽然我不认为你需要SaveChangesAsync,因为看起来你实际上并没有改变任何东西。 -
您将如何不使用 使用
await来实现该方法?显然它是可能的(异步编程是在await甚至被添加到语言之前完成的)但await是专门添加的,因为它比替代方案容易得多。如果您只是删除了await关键字并且没有做任何其他事情,那么整个事情当然不会编译,所以您需要做 something。 -
想象一下,在例程中使用
await的需要取决于例程的调用者。你怎么知道如果你的调用者正在使用它?即使您确实知道这一点, 立即等待任务并将其存储以供稍后等待都是有效的技术,您如何区分它们? -
@juharr 感谢您的回复。实际上 SaveChangesAsync() 是需要的,但为了简单起见,我不得不删除一些代码
-
@Servy 我在 GetUser 中等待一次调用 db。然后,随着我对 db 的调用增加,我觉得每个人都重复等待有些奇怪
标签: c# asp.net-core asynchronous async-await