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

Jal*_*aid 4 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 5

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

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

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

  • @remio:是的,如果什么都没有引用它们,它们可能被垃圾收集. (2认同)