我想知道 Web 应用程序中的并发实际上是如何工作的。我读过几篇文章,据我了解 HttpApplication 的多个实例将同时工作。现在,我创建了一个简单的 Web 应用程序来测试并发性,并将以下内容放入 global.asax:
protected void Application_BeginRequest(object sender, EventArgs e)
{
Response.Write("Request started: " + DateTime.Now);
System.Threading.Thread.Sleep(10000);
Response.Write("<br />");
Response.Write("Request ended: " + DateTime.Now);
Response.End();
}
我预计,如果我几乎同时在多个浏览器选项卡中浏览到 Web 应用程序根目录,它们将同时启动和停止。然而,他们似乎并不这么认为。第二个选项卡的开始时间与第一个选项卡的结束时间相同。然后,我通过在 httpmodule 或 default.aspx page_load 中使用相同的代码进行测试,并得到相同的结果。
这里发生了什么?为什么请求不被并行处理?
Edit:我的理解主要集中在两篇文章上:
http://msdn.microsoft.com/en-us/magazine/cc188942.aspx http://msdn.microsoft.com/en-us/magazine/cc188942.aspx说“如果针对同一应用程序的多个请求同时到达,则将使用多个 HttpApplication 对象。”
and 有一个 aspx 页面的示例,基本上执行我测试的操作,并带有注释“模拟慢速请求,以便我们可以并排看到多个请求”。 Thread.Sleep 调用旁边
我可能完全误解了某些事情......但是什么?
每个到达的请求都被路由到一个单独的 HttpApplication 对象。 HttpApplication 对象要么是从头开始创建的,要么是从池中分配的。创建的 HttpApplication 对象的最大数量受到可用线程的最大数量的限制。在 ASP.NET 1.x 中,我认为默认值是 20 左右。在 ASP.NET 2.0 下,此限制是动态管理的。
在应用程序开始崩溃之前,您需要创建足够的请求来耗尽 ASP.NET 线程池。
代码文章中的注释的意思并不是他的代码成为服务器的瓶颈,而是他使用它作为一种能够并排查看多个请求状态的方法,例如不同的线程 ID。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)