2009-02-10 93 views
0

在我的應用程序使用ParameterizedThreadStart委託創建線程後,該線程執行一些初始化並運行完成。後來,我可以觀察到此線程不再有效,因爲它的IsAlive屬性爲false,而ThreadState屬性爲ThreadState.StoppedC#託管線程清理

一旦線程達到此狀態,它們將保留在我的應用程序中,仍然作爲線程對象存在,直到我的應用程序關閉。一旦他們不再活躍,我可以採取哪些措施來處理他們?我想刪除對象並釋放任何資源,以便在任何給定的時刻我唯一的線程對象是活動線程。但是線程並沒有實現IDisposable,所以我不知道我該怎麼做。

回答

2

您正在保持對代碼中線程的引用。

如果您已經編寫了檢查線程狀態的代碼,那麼該代碼本質上將保持線程對象處於活動狀態,直到GC收集它。

一旦你完成了一個線程,或者理想情況下,如果你不需要訪問它,確保你清空所有對它的引用。線程沒有實現IDisposable,因爲你已經明確這對線程沒有意義。

線程在.Net中是原生的,因此您不必擔心泄漏。如果您確定他們會停止,那麼只要您確定完成,就從名單中刪除它們。

+0

我認爲這可能是這種情況,所以我盡我所能刪除對象的所有引用。使用VS調試器我檢查了線程periodicaly的狀態,它仍然是一個有效的線程對象。我想這意味着我仍然在某處引用它? – Chris 2009-02-10 20:36:54

1

聽起來好像你需要放棄對Thread對象的引用,所以垃圾收集器可以丟棄它。只需將參考號設置爲null,並讓GC在準備就緒後完成工作。

根據你的情況,你不妨使用WeakReference(或我的朋友Cyrus'WeakReference<T>)。

1

非託管線程是否仍然存在,線程實際上是否從其ParameterizedThreadStart方法返回?也請嘗試使IsBackground = false