16

Thread.NETでは、このコードの後に​​、オブジェクトがガベージコレクションされるのを防ぐメカニズムは何ですか?

new Thread(Foo).Start();
GC.Collect();

はい、何かがスレッドへの参照を持っていると仮定するのは安全です、私はちょうど何を正確にさまよっていました。なんらかの理由でReflectorが表示されないSystem.Threadingので、自分で掘り下げることはできません(MSが.NET Frameworkのソースコードをリリースしたことは知っていますが、手元にありません)。

4

6 に答える 6

16

ランタイムは、スレッドが実行されている限り、スレッドへの参照を保持します。誰かがまだその参照を保持している限り、GC はそれを収集しません。

于 2008-09-17T10:20:18.103 に答える
8

スレッドが実行されているかどうかによって異なります。Thread オブジェクトを作成したばかりで開始していない場合、それは通常のマネージド オブジェクトです。つまり、GC の対象となります。スレッドを開始した直後、または既に実行中のスレッドの Thread オブジェクトを取得する (GetCurrentThread) 場合は、少し異なります。「公開されたオブジェクト」であるマネージ スレッドは、CLR 内で強い参照を保持するようになったため、常に同じインスタンスを取得できます。スレッドが終了すると、この強力な参照が解放され、(現在は死んでいる) スレッドへの他の参照がなくなるとすぐに、管理対象オブジェクトが収集されます。

于 2008-09-19T10:00:35.170 に答える
2

これは、ガベージ コレクターに組み込まれた機能です。実行中のスレッドは収集されません。

于 2008-09-17T10:26:14.627 に答える
0

スレッドがどこかで実行されていて、そのスレッドへの参照がある場合、ガベージ コレクションを停止するのに十分ではないのではないでしょうか。

于 2008-09-17T10:17:16.830 に答える
0

ただし、注意すべき重要な点 - スレッドが IsBackground=True でマークされている場合、プロセス全体が終了するのを妨げません。

于 2008-09-19T09:38:17.080 に答える
-3

新しいスレッドをローカル フィールドに割り当てますか?

class YourClass
{
  Thread thread;

  void Start()
  {
    thread = new Thread(Foo);
    thread.Start();
    GC.Collect();
  }
}

ガベージ コレクションは参照ではないすべてのものを収集するため、コードにはスレッドを参照するフィールド/変数がないため、収集されます。

于 2008-09-17T10:19:11.070 に答える