【发布时间】: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