バックグラウンド タスク (ネットワークのリッスンと読み取り) を別の .xml ファイルで実行するアプリケーションがありますThread
。ただし、アプリケーションを閉じる (タイトルバーの「x」ボタンをクリックする) と、スレッドが終了/中止されていないようです。それは、メインの Thread ルーチンがwhile(true) {...}
. ここでの解決策は何ですか?「while」ループの条件としてスレッドの「中断」フラグを探していましたが、見つかりませんでした。
5 に答える
最も簡単な方法は、スレッドのIsBackgroundプロパティを true に設定することです。これにより、アプリケーションを開いたままにすることができなくなります。すべての非バックグラウンド スレッドが終了すると、アプリケーションは終了します。
スレッドを停止するためのより制御された方法は、メッセージを送信して正常にシャットダウンし、メイン スレッドを終了させる前にスレッドが終了していることを確認することです。
お勧めしない方法は、 を呼び出すことThread.Abort
です。これには多くの問題があり、そのうちの 1 つは、スレッドの終了が保証されないことです。ドキュメントから:
通常、このメソッドを呼び出すと、スレッドが終了します。
鉱山を強調します。
いつでも問題を強制できます。
class Program
{
public static void Main()
{
// ... do stuff
Environment.Exit(Environment.ExitCode);
}
}
Mark が既に述べたように、Thread.IsBackground プロパティを true に設定することをお勧めします。
while(true) ループを改善できます
void DoWork() {
while(!ShouldIQuitManualResetEvent.WaitOne(0)) {
// do something
}
IDidQuitManualResetEvent.Set()
}
識別子の名前よりも短く、もう少し優雅です。
次のようにスレッドを開始できます。
ThreadPool.QueueUserWorkItem(DoStuff, input)
また、アプリケーションを閉じると自動的に中止されます。
の代わりにwhile(true)
、次のようにする必要があります。
while(appIsRunning)
{
}
そして、あなたのフォームのクロージングイベントで、
appIsRunning = false;
thread.Join(2000);
最後の行は、スレッドが正常に終了するのを確実に待つためのものです。スレッドを強制的に終了させる方法は他にもたくさんありますが、問題はそこにあります。強制したくはなく、できるだけ自然に終了させたいのです。
参加後、スレッドのステータスをチェックして、スレッドが終了したかどうかを確認できます。そうでない場合は、(そしてその場合にのみ)アボートで終了を強制し、何かが正常に終了していないことをユーザーに通知する(またはログレコードを書き込む)場合があります。