如果我们在方法范围而不是类范围声明一个线程,它会对垃圾收集器产生任何影响,例如:
//scenario 1
public class Foo
{
public Foo()
{
new Thread(()=> /*engine*/) { IsBackground = true }.Start();
}
}
//scenario 2
public class Bar
{
private readonly Thread _engineThread = null;
public Bar()
{
_engineThread = new Thread(()=> /*engine*/) { IsBackground = true };
_engineThread.Start();
}
}
答案 0 :(得分:5)
是 - 在第一种方法中,只要底层线程完成,Thread
对象就有资格进行垃圾收集。
在第二种方法中,如果Bar
的实例仍然不符合垃圾回收的条件,则会阻止Thread
对象被垃圾回收。我怀疑这会对底层操作系统线程产生任何影响,请注意。
我不会考虑GC的含义 - 我会专注于可读性。出于某种原因,您是否需要引用该后台线程?如果是这样,请使用第二种方法,以便您可以使用它。如果不需要它,那么将它作为一个字段就毫无意义。