【问题标题】:When are thread local variables freed in C#何时在 C# 中释放线程局部变量
【发布时间】:2012-11-20 12:21:44
【问题描述】:

在以下代码中:

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 进行垃圾回收是个好主意吗?

谢谢

【问题讨论】:

    标签: c#


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢您的澄清。我希望 ThreadPoolWorker 行为正常。
    • 是的,我还认为捕获变量可能会延长 l1 和 l2 的寿命,直到委托完成执行。但不确定。
    • @LewsTherin 好吧,对于捕获变量,它肯定会延长寿命。更多的是关于匿名委托是否需要清理。
    • 我不担心延长寿命,但更多的是 ThreadPool 长期持有委托和 l1 和 l2。这会影响内存占用。
    • 是的...这可能取决于 Threadpool 是否决定重用 WaitCallback 对象?无论如何,听起来很有趣..祝你好运! :P
    猜你喜欢
    • 2011-10-26
    • 2011-01-18
    • 2014-07-16
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多