2009-04-21 10 views
1

C#のlanメッセンジャーのシミュレーションでは、lanのリモートホストからのブロードキャスト通知をリスンするスレッドを作成しました。ブロードキャストメッセージを聞くために、私はスリープ機能を呼び出していて、スレッドの実行を再開します。 この問題は、フォームを閉じるとこのスレッドが実行され続けるということです。フォームを閉じると呼び出されるイベントはありますか?イベントを閉じる形式

答えて

1

スリープ機能の代わりに、スレッドはメイン(フォーム)スレッドからの信号を待つ必要があります(タイムアウトはスリープメソッドのスリープ時間と同じです)。クローズイベント取り扱う際

  1. をメインスレッドは、ループを終了し、メインスレッドがその作業を再開し、その作業
  2. を完了する必要があり、この信号を設定し、他のスレッドThread.Join
  3. を呼び出す必要がありますフォームを閉じる
+0

私のメインスレッドにはparallel.hで実行する必要があるいくつかのイベントがあります。 新しいスレッドがフォームクローズイベントを検出してその後終了する可能性はありますか? 可能であれば、コードスニペットを提供してください。ありがとう – Avik

+0

ワーカースレッドが1つまたは複数ある場合は問題ありませんが、Thread.Joinは依然として最良の方法です(http://stackoverflow.com/questions/263116/c-waiting-for -all-threads-to-complete)を指定します。 Form.Closedによってトリガされる何らかの信号を引き続き使用することができます。この信号はワーカースレッドによって使用され、終了する必要があることがわかります。しかし、一般に、終了するだけでなく、他のすべてのスレッドが終了することを望むだけでなく、アプリケーションを責任をもって終了させる主スレッドを作成することをお勧めします。 –

2

リスナースレッドで.IsBackgroundプロパティをtrueに設定すると、アプリケーションを終了するときに閉じられます。

Form.Closingは実際にフォームが閉じる前に呼び出され、Form.Closeは後で呼び出されます。これらのいずれかを使用してスレッドも終了できます。