繁体   English   中英

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

[英]Bad practice to return from method before async operation completes?

我有一个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的情况下返回方法或者它被认为是一种不好的做法,这会导致我潜在的问题吗?

这并不是很糟糕 ,因为在这种情况下,你只是在阅读数据,而你只是忽略了结果。 对于每个虚假请求(这可能不会经常发生),您将承担额外的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);
}

这是完全可以接受的。 asyncawait ,你没有做任何不正确的事情。 关于关键字的一些注意事项:

async关键字只是启用了await关键字的使用。 await关键字是所有“魔法”发生的地方,即; 异步状态机将暂停方法执行并在“等待”异步操作完成时返回到该点。

一个重要的考虑:

GetCatAsync()是否返回表示已启动的异步操作的TaskTask<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);
}

但是,斯蒂芬克利里打败了我 - 在上面喊出来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM