2008-11-21 34 views
2

我想知道Web应用程序中的并发性是如何工作的。我读过几篇文章,并且我的理解是HttpApplication的多个实例将同时工作。现在,我创建了一个简单的Web应用程序来测试并发,把下面给Global.asax中:IIS,Asp.NET管道和并发

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

这是怎么回事?为什么这些请求不是平行的?

编辑:我把我的理解主要是两篇文章:“如果多个请求针对同一应用程序同时到达,多一个HttpApplication对象将使用”

http://msdn.microsoft.com/en-us/magazine/cc188942.aspx

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

回答

3

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

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

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

+0

谢谢凯夫,看到我的答案也...我认为,奇怪的事情正在发生! – mmiika 2008-11-21 06:35:38

1

你为什么不修改样本打印线程ID?这将告诉你是否有多个线程同时处理这些请求。我敢打赌。

+0

线程ID确实每隔一段时间都会改变,但每个请求仍然会一个接一个地开始。 – mmiika 2008-11-21 06:05:14

3

嘿。问题是Google Chrome。我在其中打开了两个选项卡,看起来他们指向的是同一个url,请求按顺序发送,一个接一个地完成!

尽管感谢您的想法!

+0

谢谢!有同样的问题... :) – 2015-01-09 13:52:15