在线程完成它的工作后,我应该将线程引用显式设置为null吗?

时间:2012-05-20 07:30:37

标签: c# multithreading

我应该在线程完成它的工作后显式地将线程引用设置为null,还是没有必要?如果我想将其设置为null,那么我应该在代码中的哪个位置执行此操作?

我是否应该使用thread.isalive标志检查线程是否处于活动状态,如果它不活动,则将其设置为null?

2 个答案:

答案 0 :(得分:3)

您应该像任何其他对象一样对待线程:
只要你需要它就可以保留一个参考(例如Join())。

如果你有一个长生命引用线程(即在静态字段中),那么当你不再需要它时,你应该将它设置为null。但更好的是没有这样的变数。

答案 1 :(得分:3)

  

我应该在线程后将线程引用显式设置为null   完成它的工作还是没有必要?

就个人而言,我不会打扰。在某些情况下,将对象引用显式设置为null无论如何都非常重要。无论类型如何:

  • 如果变量是静态成员,并且它引用的对象会消耗大量内存。
  • 如果变量是包含在较长的活动对象中的实例成员,该活动对象引用消耗大量内存的对象。
  • 如果变量是长期运行方法的本地变量,它引用消耗大量内存的对象。 1

那些是我能想到的。也许还有更多,但可能并不多。这里的共同点是变量引用消耗大量内存的对象。托管Thread对象本身不会占用大量内存,所以我无法想象将Thread类型的变量设置为null将为您完成很多任务,无论它如何使用。大多数资源在线程启动时分配,然后在线程结束时被释放。

  

我应该使用thread.isalive标志检查线程是否存活   如果它还没有存活,则将其设置为null。

我更喜欢使用Thread.Join来测试并等待线程的完成。事实上,我永远不会使用Thread.IsAlive用于任何有用的东西......永远。


1 如果GC可以检测到不再使用该引用,那么GC实际上足够聪明,可以在方法结束之前处理本地对象引用。