2010-12-17 50 views
7

問題是,是否有可能從多個線程執行同一會話的請求? ASP.NET中的方法是否可重入?特別是我們正在使用AJAX,這意味着異步請求正在發生。我是否需要關心帶有AJAX的ASP.NET中的線程安全性?

這是否意味着鎖定操作放置在會話內的對象?

我知道在處理靜態變量和應用程序變量時,鎖是必不可少的,但問題在於會話對象的情況是一樣的嗎?

回答

3

ASP.NET通常每個請求使用一個線程。它可以使用多個線程,例如當服務asynchronous pages,但即使只有一個線程將在任何給定的時間處理請求。

但是,使用多線程的會話狀態是安全的,但是,因爲對會話對象的訪問被序列化。 From MSDN

如果其他頁面試圖同時訪問會話狀態 怎麼辦? 在這種情況下,當前請求 最終可能會處理不一致的 數據或不是最新的數據。 只是爲了避免這種情況,會話狀態 模塊實現了讀取器/寫入器 鎖定機制並將 隊列隊列訪問狀態值。 具有會話狀態寫入權限的頁面 在會話 上保持寫入鎖定,直到請求終止。

+0

我不完全同意這句話* ASP.NET對每個請求使用一個線程,無論它是否爲異步*。如果您使用[異步頁面](http://msdn.microsoft.com/zh-cn/magazine/cc163725.aspx),則不是這樣。 – 2010-12-17 10:56:59

+0

您提供的鏈接是ASP,而不是ASP.Net。我不知道這篇文章是否也適用於ASP.Net。 – GvS 2010-12-17 11:41:47

+0

@GvS,true,鏈接和報價已更新。謝謝:) – 2010-12-17 11:45:07

2

問題是,是否有可能從多個線程執行同一會話的請求?

如果您在頁面內使用HTTP會話,那麼同一會話的請求將由ASP.NET引擎排隊。他們永遠不會平行運行。例如,如果您向使用會話的某個ASP.NET頁面發送多個AJAX請求,則這些請求將按順序執行。

如果您不使用Session,那麼多個併發請求將並行運行。

+0

我不知道,你在哪裏發現的?我有興趣閱讀更多。 – 2010-12-17 12:15:21

+0

@Antony:這裏是一篇文章http://msdn.microsoft.com/en-us/library/aa479041.aspx#aspnetsessionstate_topic3 – 2010-12-17 12:42:16