少なくともCE(デスクトップ)のスレッドの仕組みを理解する必要があります。通常、プロセスのプライマリ(エントリ)スレッドが終了すると、OSスケジューラに通知され、そのすべてのワーカースレッドは終了予定です。次にスレッドが量子(処理時間のスライス)を要求すると、それらは強制終了されます。これが重要なビットです。
ブロッキングOSコール(たとえばWaitForSingleObject(INFINITE)
)でバックグラウンドスレッドが「スタック」している場合、そのスレッドは決してスケジューラから量子を要求しません。スケジューラがスレッドを実行する時間を決して尋ねられない場合、スレッドは決して実際に終了する機会を与えられない。
これはワーカースレッドがに常ににアクティビティループでタイムアウトを設定する主な理由です(どこでも無制限のタイムアウトを使用すると、おそらくエラーになると私は主張します)。タイムアウトが戻って再び待機しても、スケジューラにスレッドを強制終了する機会が与えられます。
プロセスを終了するためにtoolhelp APIを使用することができます(IIRCは、スケジューラに作業を行わせるためにIIRCによってワーカースレッドを一時停止および再開します)。私はそれがうまくいくかどうかは確かではありませんが、試しにP/Invokeするのはかなり簡単です。
貴重な情報をありがとう。私は最終的にとにかくそのアプリケーションをきれいにする必要がありますが、私はtoolhelpのAPIルートを試してみましょう。 –