2011-08-04 29 views
12

當一個線程池線程完成後,像名稱或線程本地數據得到重置的東西嗎? 所以當下一次線程從池中出來時,它就像全新的?.NET ThreadPool線程在返回到池時會被重置嗎?

是否有關於ThreadPool線程的這方面的「官方」文檔?

+1

[使用帶有ThreadStatic屬性的並行擴展的可能的重複。可以泄漏內存?](http://stackoverflow.com/questions/3029449/using-parallel-extensions-with-threadstatic-attribute-could-it-leak-memory) –

回答

8

它在釋放時不會清除線程本地存儲,這是最重要的方面。

http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

當線程池中重用線程,它不會清除 線程本地存儲或在標有 ThreadStaticAttribute屬性字段中的數據。因此,通過一種方法放入 線程本地存儲的數據可以暴露給由同一線程池線程執行的任何其他方法 。 訪問標記爲ThreadStaticAttribute 屬性的字段的方法可能會遇到不同的數據,具體取決於池線程執行它的哪個線程 。

這是值得非常小心......

+0

感謝您的鏈接到msdn。當然,當我看到信息塊丟失的2.0版本。 –

3

答案是否定的,它不會被重置。但是,不應該依賴這個事實,因爲無論您的下一個工作項目是在新線程還是在重用線程上執行,它都取決於線程池。所以你可能會看到或者看不到線程本地存儲。出於這個原因,我不建議在線程池上使用線程本地存儲。線程池實現是一個內部細節,是一個可以改變的主題。

現實世界的比喻將是你每天上班的公共汽車。讓我們說出於某種原因,你想把你的包放在公共汽車上,因爲你知道它不會被盜。這是一個壞主意,因爲下次你上車時你可能找不到你的包。只是因爲它可能是一輛不同的巴士。公共汽車站可能會在公交線路之間旋轉公交車,或者可能會處理舊公交車。就像線程池可能會重用或退出線程而不讓你知道。

相關問題