何时在C#中释放线程局部变量

时间:2012-11-20 04:17:22

标签: c#

在以下代码中:

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是Thread本地非常大的列表。他们什么时候有资格进行垃圾收集?当线程完成执行块时,它们是否符合条件?

当线程完成后,强制执行l1和l2的垃圾收集是个好主意吗?

感谢

1 个答案:

答案 0 :(得分:4)

首先,调用GC.Collect只调度垃圾收集。如果某些内容仍被引用,则仍然无法收集。

至于你的答案,我相信这些将在不再被引用时收集,这将要求代表完成而不再被引用。

因此,如果它是一个简单的用法,我相信代表将在完成后清理,然后将清理列表

但是,您可能会陷入匿名委托未被清理的陷阱,但我认为ThreadPool应该处理这个问题。如果没有,那么您可能会对this SO, especially Rory's answer

感兴趣