2012-03-03 24 views
1

誰かがWindows Mobile 5デバイスでアプリケーションを強制終了しようとしていましたか?プロセスを強制終了しないでください

これは、例外がスローされたときに適切にクリーンアップされないような数のバックグラウンドスレッドを持つ.net 3.5 winformsアプリケーションです。それは、私が推測しているのは、殺しが発行された場合です。そして、どちらの場合も、プロセスは3つのバックグラウンドスレッドを表示することでハングアップし、リセットなしでは消えません。

実際にコードのバグを修正する以外の方法はありますか?

答えて

2

少なくともCE(デスクトップ)のスレッドの仕組みを理解する必要があります。通常、プロセスのプライマリ(エントリ)スレッドが終了すると、OSスケジューラに通知され、そのすべてのワーカースレッドは終了予定です。次にスレッドが量子(処理時間のスライス)を要求すると、それらは強制終了されます。これが重要なビットです。

ブロッキングOSコール(たとえばWaitForSingleObject(INFINITE))でバックグラウンドスレッドが「スタック」している場合、そのスレッドは決してスケジューラから量子を要求しません。スケジューラがスレッドを実行する時間を決して尋ねられない場合、スレッドは決して実際に終了する機会を与えられない。

これはワーカースレッドがに常ににアクティビティループでタイムアウトを設定する主な理由です(どこでも無制限のタイムアウトを使用すると、おそらくエラーになると私は主張します)。タイムアウトが戻って再び待機しても、スケジューラにスレッドを強制終了する機会が与えられます。

プロセスを終了するためにtoolhelp APIを使用することができます(IIRCは、スケジューラに作業を行わせるためにIIRCによってワーカースレッドを一時停止および再開します)。私はそれがうまくいくかどうかは確かではありませんが、試しにP/Invokeするのはかなり簡単です。

+0

貴重な情報をありがとう。私は最終的にとにかくそのアプリケーションをきれいにする必要がありますが、私はtoolhelpのAPIルートを試してみましょう。 –

0

アプリケーションで使用しているバックグラウンドスレッドを追跡していますか?私はWindowsフォームアプリケーションで例外をスローし、主要アプリケーションスレッドを強制終了させることで、たとえ大規模なアプリケーションを強制終了したとしても、バックグラウンドスレッドを実行させることができます。アプリケーションが追跡している場合、アプリケーションがクラッシュする前に、例外処理の一環としてバックグラウンドスレッドを明示的に終了することができます。

それ以外の場合は、バックグラウンドスレッドで定期的にメインアプリケーションが実行されているかどうかを確認し、実行されていない場合は、自分自身を終了させることができます。全く清潔ではありませんが、別の可能性があります。

+0

私の質問で言及したように、それはきれいにされていない可能性が高いです。私はちょうどそのようなアプリを殺すための方法があるのか​​どうか疑問に思っていた。それは私のアプリではないと私は簡単な方法を探しています:) –

関連する問題