2013-03-23 35 views
7

在我的web應用程序中,我使用的是System.Web.HttpContext.Current,它表示當前的命中上下文,我想知道它是如何從任何地方訪問的,直到我注意到它是一個static成員! 雖然它的靜態成員如何保持它的價值,而如果兩個請求幾乎在同一時間收到。 像下面這樣:System.Web.HttpContext.Current在請求之間是靜態的

#Req1----> | set the value of the static field to req1 
#Req2----> | set the value of the static field to req2 
#Req1  | use that static its supposed to be req2 while its req1 

我錯過理解的東西,或在它裏面一招還是什麼?

回答

5

這是一個非常聰明的問題!

HttpContext.Current被實現爲線程局部變量。實際上,它使用LogicalCallContext來實現,但它的行爲像線程本地。

把它看成是這樣的:

[ThreadLocal] 
public static HttpContext Current; 

是的,這意味着只有主請求線程可以訪問它。它將在您啓動的其他線程上爲空。

+0

先生,非常感謝您的回答!現在一切都變得更加清晰了,但是我有一個問題,你用'LogicalCallContext'實現了什麼意思,並且再次感謝你提供了非常有用的答案。 – Hilmi 2013-03-23 14:35:46

+0

當您使用Reflector撬開屬性時,您會發現該值不是來自靜態線程本地字段,而是來自CallContext,而來自LogicalCallContext。他們是我不瞭解的低級基礎課。它們實質上是每個線程的數據結構(但不完全)。我認爲ASP.NET或WCF中的每個請求都有一個這樣的調用上下文,但我可能是錯誤的。 – usr 2013-03-23 14:44:25

+0

非常感謝先生,我會進一步搜索這個主題,但你的答案已經完成!再次感謝。 – Hilmi 2013-03-23 14:47:12

相關問題