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

C# 线程创建范围和垃圾收集器,c#,multithreading,garbage-collection,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 =

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

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

是-在第一种方法中,
线程
对象将在底层线程完成后立即符合垃圾收集的条件

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


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

在场景1或场景2中,
Foo
Bar
的实例是否可以在线程结束之前进行垃圾收集?如果是,它们可以在线程结束之前被收集吗?@remio:是的,如果没有任何东西包含对它们的引用,它们可以被垃圾收集。