【问题标题】:Garbage Collection with ThreadPool使用线程池进行垃圾收集
【发布时间】:2011-11-02 14:48:57
【问题描述】:

鉴于以下...

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 的局部变量声明空间中。在线程完成之前,这将是足够的参考来保留它们。这是正确的吗?

【问题讨论】:

  • 需要保留吗?入队的方法是静态的,因此不隐式需要对 MyWorkerClass 实例的任何引用。
  • 旁注:在线程池中排队长时间运行的作业通常不是一个好主意,因为它会强制池产生额外的线程。

标签: c# .net multithreading garbage-collection threadpool


【解决方案1】:

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

按照您现在的代码,两个实例都立即符合条件。

如果您希望 MyClass 或 MyWorkerClass 一直存在,请从 SomeLongRunningProcess 或调用它的闭包中引用它。

【讨论】:

  • SomeLongRunningProgress 没有this,因为它是一个静态方法。如果您希望MyClassMyWorkerClass 闲逛,请使用GC.KeepAlive。这就是它的用途。
猜你喜欢
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 1970-01-01
相关资源
最近更新 更多