2009-11-12 55 views
1

看一個非常簡單的Web項目,託管在IIS中,帶有一個簡單的aspx頁面,執行一些代碼(從db獲取一些數據並填充一些控件),以下哪項是真的:瞭解ASP.Net實例和線程

每個頁面請求共享codebehind類的同一個實例。
或每個頁面請求都在它自己的代碼隱藏類的實例中運行。

是否有一個線程/實例針對每個aspx頁面運行。或者一個線程/實例是否覆蓋多個頁面?

我試圖理解,在一個簡單的Web項目中,接收100個頁面請求,他們將連續運行一個接一個,或多個實例/線程爲每個請求?

+1

我並不質疑你的問題的有效性......但我很想知道你爲什麼對此感興趣。 – Larsenal 2009-11-12 21:51:18

+0

我試圖理解,如果我在代碼隱藏中聲明和設置對象,並且我的函數需要一些時間,是否需要開始考慮thread安全。 – Andy 2009-11-12 21:58:40

回答

5
  • 每個請求都會獲得一個新的代碼隱藏類實例。
  • 代碼隱藏類的一個實例提供一個請求。
  • 不同時間點的兩個請求可能在線程池的同一線程上運行。
  • 並行運行的兩個請求每個都得到一個線程(我認爲;如果有一些我不知道線程的角落案例,則不是100%確定)。

因此,一個web服務器可以並行處理多個請求,但是當然可以同時處理多少個請求。

2

對於每個請求,類的後面都有一個實例。

嗯,實際上它是一個aspx頁面類的實例,它繼承自class後面的代碼。 (這就是爲什麼你正在使用的代碼隱藏事件處理程序的protected關鍵字,因此繼承類可以訪問它們。)

還有,你做一個Server.TransferServer.Execute的情況下,則該請求被轉移到另一個頁面實例。

有幾個線程在IIS處理請求中運行,通常一個請求在一個線程中處理,但在某些情況下請求可以從一個線程移動到另一個線程。

如果有100個請求到達服務器,它將開始在單獨的線程中處理其中的幾個請求,並將其餘的請求放入隊列中。值得注意的是,服務器一次只能從每個用戶處理一個頁面,因此除非使用無會話頁面(使其匿名),否則它不會爲並行線程中的同一用戶處理兩個頁面,這會使整個線程部分成爲很容易。