鉴于以下情况...

public MyClass
{
    public void MyClass()
    {
        var myWorkerClass = new MyWorkerClass();
        myWorkerClass.DoSomething();
        // and exit quickly
    }
}

public MyWorkerClass()
{
    public void DoSomething()
    {
        ThreadPool.QueueUserWorkItem(() =>
            {
                SomeLongRunningProcess();
            });
    }

    public static void SomeLongRunningProcess()
    {
        // Something that takes a long time
    }
}

MyWorkerClass和MyClass什么时候有资格进行垃圾回收?

我的想法是MyWorkClass.DoSomething()中的匿名函数将存储在MyWorkerClass的局部变量声明空间中。这将足以在线程完成之前将它们保留下来。这样对吗?

最佳答案

MyClass应该有资格立即被收集。在SomeLongRunningProcess()完成之后,MyWorkerClass将有资格进行收集(假设上述方法引用了“this”,在您的示例中没有)。

按照您的代码现在的样子,这两个实例都可以立即使用。

如果希望MyClass或MyWorkerClass徘徊,请从SomeLongRunningProcess或调用它的闭包中引用它。

10-08 14:28