使用ThreadPool进行垃圾收集

本文关键字:ThreadPool 使用 | 更新日期: 2023-09-27 18:13:20

鉴于以下…

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的局部变量声明空间中。这将是一个足够的参考,以保持他们周围,直到线程完成。这是正确的吗?

使用ThreadPool进行垃圾收集

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

根据您的代码,这两个实例都立即符合条件。

如果你想让MyClass或MyWorkerClass挂起,从SomeLongRunningProcess或调用它的闭包中引用它。