线程创建范围和垃圾收集器

时间:2011-06-20 06:09:40

标签: c# multithreading garbage-collection

如果我们在方法范围而不是类范围声明一个线程,它会对垃圾收集器产生任何影响,例如:

//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();
    }
}

1 个答案:

答案 0 :(得分:5)

是 - 在第一种方法中,只要底层线程完成,Thread对象就有资格进行垃圾收集。

在第二种方法中,如果Bar的实例仍然符合垃圾回收的条件,则会阻止Thread对象被垃圾回收。我怀疑这会对底层操作系统线程产生任何影响,请注意。

我不会考虑GC的含义 - 我会专注于可读性。出于某种原因,您是否需要引用该后台线程?如果是这样,请使用第二种方法,以便您可以使用它。如果需要它,那么将它作为一个字段就毫无意义。