c# - 在异步操作完成之前从方法返回的坏习惯?

标签 c# asp.net asynchronous asp.net-web-api async-await

我有一个 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);
}

关于c# - 在异步操作完成之前从方法返回的坏习惯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36423754/

相关文章:

c# - TextBox 变空时 UpdateSourceTrigger 不起作用

c# - 对使用 Azure 云服务的代码进行单元测试

c# - 从 C#.NET 中的代码隐藏调用 Javascript 函数

javascript - 带有异步 : false and return data 的 jQuery Ajax

ios - GCD : asynchronously wait for condition

javascript - 使用 setTimeout 推迟所有繁重的计算

c# - 使用 Access 数据库部署 C# 应用程序,无需安装 Access

c# - 如何使用 razor 页面在 ASP.Net Core 上将对象从一个页面传递到另一个页面?

asp.net - SSRS Web 服务访问异常 - 401 未经授权的方案 'Ntlm'

c# - 避免将“转换为”