2011-06-20 8 views
3

我々は法の範囲ではなく、クラススコープでスレッドを宣言した場合、それは次のように、ガベージコレクタのための任意の違いを生むん:はいスレッドの作成スコープとガベージコレクタ

//scenario 1 
public class Foo 
{ 
    public Foo() 
    { 
     new Thread(()=> /*engine*/) { IsBackground = true }.Start(); 
    } 
} 

//scenario 2 
public class Bar 
{ 
    private readonly Thread _engineThread = null; 

    public Bar() 
    { 
     _engineThread = new Thread(()=> /*engine*/) { IsBackground = true }; 
     _engineThread.Start(); 
    } 
} 

答えて

5

- 最初のアプローチでは、 Threadオブジェクトは、基礎となるスレッドが完了するとすぐにガベージコレクションの対象となります。第2のアプローチでは

BarのインスタンスがガベージコレクションであることからThreadオブジェクトを防止するガベージコレクション、対象ないある場合。私はそれが根底にあるOSスレッドに何らかの影響を与えることはないと思います。

私はGCの意味については考えていませんが、私は読みやすさに専念したいと思います。何らかの理由でそのバックグラウンドスレッドへの参照が必要ですか?そうであれば、それが利用できるように第2の方法に進みます。 がなければが必要ですが、それはフィールドとして持っていても意味がありません。

+1

シナリオ1またはシナリオ2では、 'Foo'または' Bar'のインスタンスがスレッドの終わりより前のガベージコレクション*に適している可能性がありますか?はいの場合、スレッドが終了する前にそれらを収集できますか? – remio

+2

@remio:はい、何も参照を保持していない場合、ガベージコレクションされる可能性があります。 –

関連する問題