2012-01-20 9 views
1

メインスレッドはスレッドを生成し、すべてのスレッドが終了するのを待って、より多くのスレッドを生成し続けることができます。スレッドの生成はユーザーによって制御されるため、ユーザーは別の時間間隔でスレッドを追加できます。メインスレッドはファイナライズCでスレッドを待ちます#

メインスレッドがファイナライズを実行しているとき、どうすればいいですか?ファイナライズでは、すべてのアクティブなスレッドが終了するまで待ちます。

+1

これは.join()メソッドを適切に使用するためのものですか? – Ismael

+2

あなたの質問には何かがありません。あなたは、ユーザーが異なる時期にスレッドを追加できると言っています。私の質問は:メインスレッドは、ユーザーを待っているときに何をしますか?メインスレッドは、ユーザーが追加するスレッドがなくなったことをどのように知るでしょうか? –

答えて

2

作成したスレッドをすべて記録します。例えば、List<Thread>コレクションを介して送信される。あなたはfinalize方法にいるときは、ちょうどすべてのスレッドを反復処理すると、以下のWaitForThreads方法に示すように、そのJoinメソッドを順番に呼び出します。

private readonly List<Thread> threads = new List<Thread>(); 

public void SpawnThread(Action action) 
{ 
    Thread thread = new Thread(new ThreadStart(action)); 
    thread.IsBackground = false; 
    threads.Add(thread); 
    thread.Start(); 
} 

private void WaitForThreads() 
{ 
    foreach (Thread thread in threads) 
     thread.Join(); 
} 

Thread.Joinブロック(あなたのメインスレッドでなければなりません)呼び出し側のスレッド特定のスレッドが終了するまでスレッドが既に終了している場合は、コールはすぐに戻ります(これは、ガベージコレクションのためには必要ですが、終了時にコレクションからスレッドを削除する必要はありません)。

なぜあなたはfinalizeメソッド内でスレッドが終了するのを待つ必要があると考えてください。メインスレッドが終了したときに強制的に強制終了されないようにするだけの場合は、必要ありません。 IsBackgroundプロパティがfalseのすべてのスレッドが実行を終了するまで、(ウィンドウがなくても)プロセスは生き残ります。ガベージコレクションの場合も同様です。ヒープオブジェクトは、ライブスレッドから参照されなくなるまでファイナライズされません。

+0

私は本当にThread.Joinは必要ありません。なぜなら、スレッドからのリターンは必要ないからです。私が必要とするのは、生成されたスレッドが作業をしている間に、メインスレッドがより多くのスレッドを受け取る準備ができていることです。 これは私がうまく動作するコードが面白いです。私が欠けていたのはIsBackground = falseだった。ライン。私は本当にこれを持っていたので、メインスレッドが終了したときに、スポーンされたスレッドはそれに伴いました。 – user1161221

+0

この文脈での用語「背景」の使用は誤解を招く。開発者にとっては、最初はすべてのスレッドが主スレッド以外のバックグラウンドスレッドであると想定するのが一般的です。喜んで助けて! – Douglas

関連する問題