在异步操作完成之前从方法返回的不良做法?

Cha*_*rly 5 c# asp.net asynchronous async-await asp.net-web-api

我有一个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);
}
Run Code Online (Sandbox Code Playgroud)

如果用户等于null并且在没有等待getCatTask的情况下返回该方法或者它被认为是一种不好的做法,这会导致我潜在的问题吗?

Ste*_*ary 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);
}
Run Code Online (Sandbox Code Playgroud)