今天發現了這個很酷的東西,可以用來標記靜態欄位。就我的理解,被標記為ThreadStaticAttribute的靜態欄位的語義將會變化,從一個正常的記憶體位址變成TLS中的一個儲存位置。就當它做訪問TLS的一種捷徑。不同的ThreadStatic靜態欄位並不會衝突,表示TLS中獨立的儲存位置。
網上的一篇文章說到了在Asp.net中使用ThreadStatic的一些問題。我不太確定我的理解是否正確,但看起來好象是說,由於asp.net複用託管線程(線程池)來服務要求,因此在對先後發生的多個請求服務時有可能使用的是同一個線程。而TLS不會因為服務新的請求而重設。因此如果ThreadStatic靜態欄位中儲存的資訊如果同請求相關,那麼後來的請求就會看到前面請求留下來的資訊。
有一篇文章還比較了ThreadStatic和CallContext類的靜態方法。上面提到CallContext中的資料會傳遞到從本線程建立的子線程或非同步線程中去。(這一點在MSDN中沒有提到,所以值得懷疑。但是上面又說HttpContext.Current是通過這個實現的;考慮到HttpContext的行為,感覺人家說的應該是對的。矛盾。)不知道這裡說的“傳遞”是指僅僅把CallContext中的資料複製一份過去還是把CallContext中的資料序列化再還原序列化給子線程。我覺得應該是前者。有時間需要測試一下。
媽的現在時間太少了很多東西都只能先靠猜了。
還發現了(instance) HttpContext.Items這個集合。就像其名稱所暗示的那樣,儲存在其中的資料僅僅是用於當前Http請求,這個集合會在每次建立新的HttpContext執行個體時重新初始化。
By the way, System命名空間下還有一個ContextStaticAttribute,其中的“Context”是指Remoting中的Context,ContextBoundObject中的Context。是應用程式定義域下面的結構。