gpt4 book ai didi

c# - 异步运行操作方法

转载 作者:行者123 更新时间:2023-11-30 17:30:41 25 4
gpt4 key购买 nike

我使用 Asp.Net Core 2 并发现了一些“错误”,也可能不是。

我有一些 Action 方法,比如

public async Task<IActionResult> Index() {
for (int k = 0; k < int.MaxValue / 2; k++) { await Task.Delay(0); }
return View();
}

public IActionResult Index() {
for (int k = 0; k < int.MaxValue; k++) { }
return View();
}

所有这些都延迟了 5 秒。

如果我在浏览器中同时(一起)运行 5 个选项卡,最后一个选项卡执行 25 秒。因为,它等待以前的选项卡。

我在 ASP.NET MVC 4 上编写这段代码,5 个选项卡执行了 5.5 秒,而不是 25 个!!!

我不敢相信。无法解决。

为什么 ASP.NET Core 2 中的操作同步运行?怎么了?我如何根据浏览器的请求理解 ASP.NET Core 2 必须创建一个新的 controller 实例,对其进行初始化并执行该方法,是这样吗?可能是我配置的项目错误?我在哪里可以更改此选项?

最佳答案

这里的问题很可能与一般的 asp.net core 或 web 服务器无关,而是与浏览器如何处理对同一 url 的并发请求有关。我无法判断所有浏览器,因此仅以 Chrome 为例。

你在 chrome 中打开了 5 个页面,所有页面都指向你服务器的同一个 url。服务器处理这个请求需要 5 秒。默认情况下,Chrome 不会同时发出所有 5 个请求。相反,它只会发出 1 个,因为它认为它可能能够缓存响应并将其重新用于其他 4 个请求。当第一个响应到达时,它发现很遗憾它不能重用它(因为您没有提供任何缓存 header )。然后以同样的希望发出第二个请求,以此类推。结果,5个请求都一一发出,希望response可以被后续请求复用。

因此,按顺序处理请求的不是 asp.net,而是网络浏览器。

如果添加一些允许浏览器缓存响应的 header ,例如:

[ResponseCache(Duration = 30)]
public IActionResult Index() {

Thread.Sleep(5000);
return Ok("test");
}

然后它将再次仅发出 1 个请求,并且在响应到达后(5 秒)它会看到确实可以重用响应。然后其他 4 个挂起的请求将被立即解决(从缓存中)。

或者如果你说浏览器不应该为这个请求存储缓存:

[ResponseCache(NoStore = true)]
public IActionResult Index() {

Thread.Sleep(5000);
return Ok("test");
}

它会发出 1 个请求,在得到响应后它意识到没有希望为后续请求重用响应(因为响应头禁止存储缓存)。然后它会同时发出 4 个待处理的请求。

当然,您不应该仅仅为了避免这种行为而使用上面提到的缓存 header - 它们只是为了确认这种行为。

一般来说你不应该担心这个。不太可能有人会在同一个浏览器中打开您的网站 5 次,即使他们这样做了 - 在这种情况下长时间等待不太可能是一个大问题。但是,如果您的应用程序以某种方式被设计成那样使用 - 您确实可以使用缓存 header 来避免这种情况。

关于c# - 异步运行操作方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49357685/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com