【问题标题】:Is using .NET HttpClient without Async is bad practice?使用没有 Async 的 .NET HttpClient 是不好的做法吗?
【发布时间】:2022-06-12 23:12:12
【问题描述】:

我正在使用 ASP.NET Core MVC (.NET 6),阅读了很多关于 PostAsJsonAsync() 方法在 async/await 中工作的示例,并且不建议使用任务的 Result 属性,因为它是阻塞的。

我很好奇如果运行 ASP.NET 服务器端应用程序真的那么糟糕吗?

例如 - 网络控制器

public IActionResult Authorized([Required] string code)
{
   if (ModelState.IsValid)
    {
        var payLoad = (dynamic)new JsonObject();
        payLoad.code = code;
        var content = new StringContent(payLoad.ToString(), Encoding.UTF8, "application/json");

        using HttpClient httpClient = new HttpClient();
        
        var result = httpClient.PostAsJsonAsync("https://www.apiserver.com", content).Result;
        string responseBody = result.Content.ReadAsStringAsync().Result;

    }
    return View();
}

代码简洁明了。 如果我更改为 Async/Await

var response = await client.SendAsync(request);
var content = await response.Content.ReadAsStringAsync();

我必须将IActionResult 更改为async Task<IActionResult>, 曾经对每分钟 100 个请求进行负载测试来比较 Sync 或 Async,似乎性能提升不大,那么有什么好处呢? 如果.Result 这么差,微软为什么不淘汰它?

【问题讨论】:

  • 主要问题是涉及 I/O 操作并且没有 async/await 线程无法保持和服务其他传入请求。
  • 在某些情况下你不能等待任务(主要是遗留代码左右),所以 Result 属性来拯救。看看这个例子:itnext.io/…
  • @MarioVernari Kestral 或 IIS 服务器本身不处理多个请求吗?我的假设是 Kestral 或 IIS 将为每个传入的请求/响应创建新线程。
  • 我不是专家,但我相信 Kestrel 正在使用线程池,因此没有多少真正的线程支持大量重用。但是,必须有人指示何时该离开服务(因为忙于 I/O)并继续另一个服务。如果没有 async/await,我认为你不能这样做(除非你使用事件机制)。

标签: c# asp.net-core asp.net-core-mvc


猜你喜欢
  • 1970-01-01
  • 2011-08-20
  • 1970-01-01
  • 2017-12-10
  • 2012-04-04
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 2014-05-02
相关资源
最近更新 更多