2014-12-22 111 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()方法使用)。类本身的实例被处置? –