2

我想知道 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 中使用相同的代码进行测试,并得到了相同的结果。

这里发生了什么?为什么不并行处理请求?

编辑:我主要将我的理解放在两篇文章中:

http://msdn.microsoft.com/en-us/magazine/cc188942.aspx说“如果针对同一应用程序的多个请求同时到达,将使用多个 HttpApplication 对象。”

并且http://www.code-magazine.com/article.aspx?quickid=0511061&page=5有一个 aspx 页面的示例,它基本上按照我的测试进行,并带有评论“模拟慢速请求,因此我们可以并排看到多个请求。” 在 Thread.Sleep 调用旁边

我可能完全误解了某些东西……但是什么?

http://www.code-magazine.com/article.aspx?quickid=0511061&page=5

4

3 回答 3

4

每个到达的请求都被路由到一个单独的 HttpApplication 对象。HttpApplication 对象要么从头开始创建,要么从池中分配。创建的 HttpApplication 对象的最大数量受可用线程的最大数量限制。在 ASP.NET 1.x 中,我认为默认值是 20 左右。在 ASP.NET 2.0 下,此限制是动态管理的。

您需要创建足够多的请求来耗尽 ASP.NET 线程池,然后才能看到您的应用程序开始步履蹒跚。

代码文章中的评论的意思并不是他的代码成为服务器的瓶颈,他使用它作为一种能够并排查看多个请求的状态的方式,例如不同的线程 ID。

于 2008-11-21T06:26:53.300 回答
3

呵呵。问题是谷歌浏览器。我在其中打开了两个选项卡,似乎当它们指向相同的 url 时,请求按顺序发送,一个接一个完成!

不过感谢您的想法!

于 2008-11-21T06:14:58.940 回答
2

为什么不修改示例以打印线程 ID?这将告诉您是否有多个线程同时为请求提供服务。我敢打赌。

于 2008-11-21T05:51:21.327 回答