2008-11-21 63 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