2009-08-30 6 views
5

GUIでいくつかのバックグラウンドスレッドを実行しています。現在、私は個人的なスレッドキャンセルコードを実装していますが、スレッドにIsBackgroundプロパティがあり、MSDNによれば、それらはキャンセルされます。アプリケーション終了時にスレッド内のIsBackgroundを安全に頼りにすることはできますか?

Thread.Abort()は厄介ですが、このバックグラウンドスレッドには何も起こっていないので、適切な状態を保つ必要があるか、または適切なクリーンアップが必要です。

ユーザーがバックグラウンドスレッドの途中でアプリケーションを閉じるだけでクラッシュしないようにしようとしています。マルチスレッドシナリオはテストするのが非常に難しいので、私はその件についてあなたの意見を聞きたいと思います。

基本的には、自分のコードをローリングするのではなく、IsBackground = Trueを設定して残りを忘れてしまいますか?

答えて

4

Thread.Abortは例外をスローします。したがって、finally/usingを使用するようにコードが正しく記述されていれば、正常に失敗してすべてのリソースを解放する必要があります。

編集

私はおそらく、もう少し詳細を与える必要があります。最初に、例外はThreadAbortException型です。興味深いのは、たとえそれを捕まえて何もしなくても、それは消えないということです。言い換えれば、キャッチブロックを離れるとすぐに、それは投げられ続けます。これは、Exceptionをキャッチしてそれを飲み込んだ(通常は悪い)練習が、スレッドが中断してしまうのを止めないようにするためです。実際にアボートを停止したい場合は、例外を捕捉してからThread.ResetAbortを呼び出す必要があります。

0

これはリソースに依存すると思います。 たとえば、プロセスが終了すると、socketは安全に閉じられます。 一部のリソースでは、スレッドを終了する前に解放する方がよいでしょう。

5

IsBackground財産の状態にMSDN page

スレッドは、バックグラウンドスレッド またはフォアグラウンドスレッドのいずれかです。背景 スレッドは、バックグラウンドが のスレッドを除いて、 のプロセスを防ぐことを除いて、前景の スレッドと同じです。プロセスに属しているすべての前景の スレッドが終了したら、 実行時に共通言語がプロセスを終了します。 の残りのバックグラウンドスレッドは、 が停止して完了しません。

だから、重要な何かがフォアグラウンドスレッドにする必要がありますなどのデータベースは半分書かれて、あなたはそれが開いているすべての接続が残っていないことを確認するためにあなたのスレッドは、かなりの守備にする必要があるだろうと私に暗示しますそれが完了するまでアプリケーションが閉じないようにします。

5

Jonathan Greensted's postが良い要約におよそIsBackgroundがあります

IsBackgroundプロパティは、スレッドが フォアグラウンド(UI)スレッドまたはバックグラウンド スレッドである場合 はランタイムに伝えることができます。デフォルトでは、 がこのプロパティを変更しない限り、すべてのスレッドは前景スレッドとして が作成されます。

私たちはなぜ気にしますか?

まあ、.NETランタイムは、何か特別な を行い、最後のフォアグラウンド スレッドが終了したとき - それは、すべての バックグラウンドスレッドを中断し、 アプリケーションを終了します。 (私たちは、アプリケーションが悪は 非常に限られた期間を持っていることをとにかくシャットダウンさ ある場合Thread.Abortしかし悪い である知っている。)

を別の言い方をすると、バックグラウンドスレッドのOKで行われている作業ですアプリケーションが終了するといつでも停止することができますか?

もしそうでなければ、フォアグラウンドスレッドでなければならないでしょう。ファイルハンドルやデータベース接続を開いているスレッドは、アプリケーションが終了する前にこのスレッドが終了するのを待つフォアグラウンドにするのが理想です。

関連する問題