我有一个Web API 2端点,我希望在检索和验证用户时异步执行操作。如果此用户不存在,我想返回404 Not Found,如下所示:
public async Task<IHttpActionResult> Get()
{
var getCatTask = GetCatAsync();
var user = await GetUserAsync();
if(user == null)
{
return NotFound();
}
var cat = await getCatTask;
return Ok(cat);
}
如果用户等于null并且在没有等待getCatTask的情况下返回方法或者它被认为是不好的做法,这会导致我潜在的问题吗?
答案 0 :(得分:8)
它并非真正糟糕,因为在这种情况下,您只是在阅读数据,而您只是忽略了结果。对于每个虚假请求(这可能不会经常发生),您将承担额外GetCatAsync
操作的成本。
如果可能,请考虑将GetCatAsync
取消,然后您才能在返回前至少开始清理:
public async Task<IHttpActionResult> Get()
{
var cts = new CancellationTokenSource();
var getCatTask = GetCatAsync(cts.Token);
var user = await GetUserAsync();
if (user == null)
{
cts.Cancel();
return NotFound();
}
var cat = await getCatTask;
return Ok(cat);
}
答案 1 :(得分:2)
这是完全可以接受的。就async
和await
而言,您没有做任何不正确的事情。关于关键字的一些注释:
async
关键字只是启用了await
关键字的使用。 await
关键字是所有“魔法”发生的地方,即;异步状态机将暂停方法执行并在“等待”异步操作完成时返回到该点。
一个重要的考虑因素:
GetCatAsync()
是否返回代表已启动的异步操作的Task
或Task<T>
?如果是这样可能会有点问题,如果不是你就好了,因为它等待以后。我建议添加取消。
public async Task<IHttpActionResult> Get()
{
var cts = new CancellationTokenSource();
var getCatTask = GetCatAsync(cts.Token);
var user = await GetUserAsync();
if (user == null)
{
cts.Cancel();
return NotFound();
}
var cat = await getCatTask;
return Ok(cat);
}
但是,斯蒂芬克莱里打败了我 - 在上面喊出来。