thread範例 - visual c# lock




應該總是保持在C#中運行的線程對象的引用? (4)

或者可以這樣做:

new Thread( new ThreadStart( delegate { DoSomething(); } ) ).Start();

我似乎還記得,在這種情況下,Thread對象將被垃圾收集,但底層的OS線程將繼續運行,直到委託傳遞給它。 我基本上尋找ThreadPool功能,但不希望線程是後台線程(即我希望他們保持應用程序活著)。

更新:根據Jason的說法,CLR實際上在運行的時候保持了Thread對象的內部引用,所以在線程退出之前它不會被垃圾回收。


在生產代碼中,我已經有了很多這樣做的例子。 所以,在一行中定義和啟動一個線程而不保留一個引用就是它的地方。 我想保留一個參考“以防萬一”你以後重新設計,需要它是失敗的原則,創造最簡單的作品。

而對於第二部分來說,不是在運行的時候不會有GC'd; 線程是GCtor從中追溯引用的根級對象。 Thread實例一旦被任何正在運行的線程(包括啟動的線程)無法訪問,就只會被GCd訪問。

並且要注意洩漏創建但從未開始的線程實例。 我相信他們會永遠活著。


我一般發現,如果我需要直接在你的例子中開始一個新的線程,而不是從線程池中獲取一個線程,那麼這是一個長期運行的線程,我將需要一個引用來殺死它,監視它等等。對於像在後台線程中調用IO這樣的短線程,我總是使用一個線程池線程(通常間接通過一個someDelete.BeginBlah(...)方法調用)。 當使用像這樣的線程池線程時,我寧願不保留引用。 我不知道另一位程序員是否可能不適當地使用該線程的引用。 如果我不需要參考,我不會把它放在雜亂的代碼。

編輯:要回答你正在被垃圾收集的線程的編輯,線程正在運行時不會發生。 CLR保持對每個正在運行的線程的引用。 表示線程的對象將不會被收集。


是的,你應該,因為你永遠不知道什麼時候你將不得不改變代碼以某種方式處理線程。 那樣,把太多東西放在這樣一條線上就是醜陋的。

所以如實地,你可以按照自己的方式來做,所以答案真的歸結為代碼風格偏好。


這取決於。 在用戶可以取消線程操作的情況下,應該保留引用,以便在用戶需要時可以取消線程。 在其他情況下,可能不需要存儲參考。





reference