C#托管线程清理

时间:2009-02-10 20:25:01

标签: c# .net multithreading

在我的应用程序使用ParameterizedThreadStart委托创建线程后,该线程执行一些初始化并运行完成。稍后,我可以观察到该线程不再处于活动状态,因为其IsAlive属性为false且ThreadState属性为ThreadState.Stopped

一旦线程达到此状态,它们将保留在我的应用程序中,仍然作为线程对象存在,直到我的应用程序关闭。一旦它们不再活动,我可以采取任何措施来处理它们吗?我想删除该对象并释放所有资源,以便任何给定时刻我拥有的唯一线程对象是活动线程。但是线程没有实现IDisposable,所以我不确定我该怎么做。

3 个答案:

答案 0 :(得分:2)

您将保留代码中对该主题的引用。

如果您编写的代码将检查线程的状态,那么该代码本身将使线程对象保持活动状态,直到GC收集它为止。

完成一个线程后,或理想情况下,如果您不需要访问它,请确保将所有引用都置空。线程没有实现IDisposable,因为你已经明确表示这对线程没有意义。

线程在.Net中是原生的,因此您不必担心泄漏。如果您确定他们会停止,那么只要您确定它已经完成就将其从列表中删除。

答案 1 :(得分:1)

听起来你需要放弃对Thread对象的引用,因此垃圾收集器可以丢弃它。只需将您的参考设置为null,并让GC在准备好后完成其工作。

根据您的具体情况,您可能希望使用WeakReference(或我的朋友Cyrus'WeakReference<T>)。

答案 2 :(得分:1)

非托管线程是否仍然存在,线程是否实际从其ParameterizedThreadStart方法返回?同时尝试制作IsBackground = false