线程池中的垃圾回收

3

假设有以下情况...

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的局部变量声明空间中。这将足以保留对它们的引用,直到线程完成。这个想法正确吗?


2
需要保留吗?被排队的方法是静态的,因此不需要隐式引用任何MyWorkerClass实例。 - spender
2
附注:通常不建议在线程池上排队长时间运行的作业,因为这会强制池生成额外的线程。 - Brian Rasmussen
1个回答

2

MyClass应立即符合收集条件。在SomeLongRunningProcess()完成后(假设前面提到的方法引用了'this',而在您的示例中没有),MyWorkerClass将符合收集条件。

现在,您的代码中两个实例都可以立即被收集。

如果您想让MyClass或MyWorkerClass保持活动状态,请在SomeLongRunningProcess内部或调用它的闭包中引用它。


1
SomeLongRunningProgress没有this,因为它是一个静态方法。如果你想让MyClass或者MyWorkerClass继续存在,请使用GC.KeepAlive。这就是它的作用。 - Raymond Chen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接