2011-06-25 20 views
6

私はコードとマルチスレッドアプリケーションの例を読んでいます。時々私はそうのようなスニペットを参照してください。スレッドが開始されると、そのスレッドへの参照を保持する必要がありますか?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("started"); 
     Go(); 
     Console.WriteLine("press [ENTER] to quit"); 
     Console.ReadLine(); 
    } 

    private static void Go() 
    { 
     var thread = new Thread(DoSomething); 
     thread.Start(); 
    } 

    private static void DoSomething() 
    { 
     Console.WriteLine("doing something"); 
    } 
} 

そして、それは私を悩ませ続けて:私はどこかのスレッド(フォアグラウンド)への参照を保持する必要がありますか?結局のところ、Goメソッド内のローカル変数です。したがって、Goの実行が完了すると、スレッド参照はガベージコレクションされる必要があります。多分、多分、スレッドは実行中にGCedされますか?

バックグラウンドスレッドの場合、回答が変更されますか?

ありがとうございます!

答えて

4

スレッドは寿命ガベージコレクタによって制御ないであるオブジェクトの一例です。フードの下では、オペレーティングシステムオブジェクトです。スレッドがコードを実行している限り、それは生き残っています。 Threadクラスは単なるラッパーです。もう1つの例はウィンドウです。コードやユーザーが閉じない限り、生きています。 Winformsでは、Formクラスラッパーへの参照を保持する必要はありません。そして、あなたは通常そうではありません:

Application.Run(new Form1()); 

は、ボイラープレートコードです。あなたはForm1クラスインスタンスへの参照をどこにも保持しません。

いつでも既存の実行中のスレッドからThreadオブジェクトを再作成できます。あなたはThread.CurrentThreadでそれを行います。また、スレッドコンストラクタで作成したスレッドである必要はありません。スレッドプールスレッド内で使用できます。またはマネージコードによって開始されなかったスレッド。あなたのプログラムの主なスレッドは、その良い例です、それはWindowsによって開始されました。

しかし、スレッドへの参照を失うのは良い方法ではありません。まだ実行中であることを確認できないことを意味します。これは、停止する必要があるときに停止できないことを意味します。ユーザーがプログラムを終了したいときなど。

2

this answerによれば、何も心配はいりません。 GCは、スレッドが使用されているかどうかを知るほどスマートです。ここで

は動作を説明する記事です:http://msdn.microsoft.com/en-us/magazine/bb985011.aspx#ctl00_MTContentSelector1_mainContentContainer_ctl03

+0

が正しいです。スレッドがGCルートであるため、何も心配する必要はありません。 –

+0

答えをありがとう。これについての文書化された参考資料への任意のチャンス? –

+0

確かに、私は参考文献を追加しました。 –

2

あなただけあなたが後でそれを使用したい場合は、参照のホールドを維持する必要があります。この場合、ガベージコレクションはスレッドが終了するまで実行されません。

フォアグラウンドスレッドとバックグラウンドスレッドの唯一の違いは、フォアグラウンドスレッドがマネージド実行環境を実行し続けることです。

これは、実行中のフォアグラウンドスレッドがアプリケーションの終了を妨げ、バックグラウンドスレッドは実行しないことを意味します。

Source

関連する問題