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 に答える