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

本文关键字:收集器 创建 范围 线程 | 更新日期: 2023-09-27 17:59:43

如果我们在方法范围而不是在类范围声明线程,这对垃圾收集器有什么不同吗,比如:

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

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

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

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

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