System. ThreadStaticAttribute

來源:互聯網
上載者:User

今天發現了這個很酷的東西,可以用來標記靜態欄位。就我的理解,被標記為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。是應用程式定義域下面的結構。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.