2014-12-22 61 views
0

叫我有一個ThreadClass initaled這樣得到錯誤

ThreadClass t = new ThreadClass(); 
Thread thread = new Thread(new ThreadStart(t.Run)); 
thread.Start(); 

我ThreadClass有析構函數:

~ThreadClass(){ // some stuff } 

這個析構函數得到所謂的「錯誤」。這意味着線程仍在運行並且正常工作。但是析構函數以不可預知的方式被調用。它不是真正可重現的,但是如果我設置斷點並長時間運行我的代碼,突然析構函數會被調用。有沒有垃圾收集清理我的ThreadClass。但如果是這樣,爲什麼我的線程繼續運行?

+0

你不應該使用析構函數。 – SLaks

回答

1

GC將在最後一個參考超出範圍後的一段時間收集一個對象。

如果您的Run()方法不使用this,您的實例可以在任何時候收集。 GC.KeepAlive()可以改變這種行爲;仔細閱讀其文檔

這就是爲什麼你不應該使用終結器來清理本地資源。

+0

*如果你的Run()方法沒有使用它,你的實例可以隨時被收集。*我相信這隻適用於保存爲本地變量的實例,不適用於其中正在執行的方法的實例線程(線程是根)。情況並非如此。我可能是錯的,如果我是,請糾正我。 –

+0

@SriramSakthivel:仔細閱讀,它看起來像'Thread'實例本身應該通過它的委託來實例化實例。 http://referencesource.microsoft.com/#mscorlib/system/threading/thread.cs,141。所以我不確定。 – SLaks

+0

哇!所以你只是說只保留ThreadClass的元素,它們仍然被引用(所有的實例變量和函數都由Run()方法使用)。類本身的實例被處置? –