【问题标题】:IIS, Asp.NET pipeline and concurrencyIIS、Asp.NET 管道和并发
【发布时间】:2008-11-21 05:13:03
【问题描述】:

我想知道 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

【问题讨论】:

    标签: asp.net iis-7 concurrency pipeline


    【解决方案1】:

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

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

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

    【讨论】:

    • 谢谢 Kev,也请看我的回答...我认为发生了一些奇怪的事情!
    【解决方案2】:

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

    谢谢你的想法!

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 线程 ID 确实不时发生变化,但每个请求仍然一个接一个地开始。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多