4

在以下代码中:

public void f() 
{
    List l1<int> = new List<int>();
    List l2<int> = new List<int>();
    //.. populate l1 and l2
    ThreadPool.QueueUserWorkItem(new WaitCallback(delegate(object state)
    {
       // use l1 and l2
       // force gc.collect l1 and l2?
    }));
    //..
}

l1 和 l2 是线程本地非常大的列表。他们什么时候有资格进行垃圾收集?当线程完成执行块时,它们是否符合条件?

线程完成后强制对 l1 和 l2 进行垃圾收集是个好主意吗?

谢谢

4

1 回答 1

4

首先,调用 GC.Collect 只会安排垃圾收集。如果某些东西仍在被引用,那么它仍然不会被收集。

至于您的回答,我相信一旦不再引用它们就会收集这些,这将要求完成委托并且不再引用它们。

所以,如果它是一个简单的用法,我相信委托完成后会被清理,这将允许清理列表

但是,您可能会陷入未清理匿名委托的陷阱,但我认为 ThreadPool 应该处理这个问题。如果没有,那么您可能对这个 SO 感兴趣,尤其是 Rory 的回答

于 2012-11-20T04:21:44.693 回答