代码之家  ›  专栏  ›  技术社区  ›  mmiika

IIS,Asp。NET管道和并发

  •  2
  • mmiika  · 技术社区  · 17 年前

    我想知道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旁边有注释“模拟慢速请求,这样我们就可以并排看到多个请求。”。睡眠呼叫

    我可能完全误解了什么。..但是什么?

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

    3 回复  |  直到 17 年前
        1
  •  4
  •   erlando    15 年前

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

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

    Code文章中的评论并不是说他的代码是服务器的瓶颈,而是将其用作一种能够并排查看多个请求(如不同的线程ID)状态的方法。

        2
  •  3
  •   mmiika    17 年前

    呵呵。问题出在Google Chrome上。我在其中打开了两个选项卡,当它们指向同一个url时,请求似乎会按顺序发送,一个接一个地完成!

    不过,谢谢你的想法!

        3
  •  2
  •   msvcyc    17 年前

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