MSDNでは、Thread.Abort()メソッドの説明に次のように記載されています。「このメソッドを呼び出すと、通常はスレッドが終了します。」
なぜいつもではないのですか?
どちらの場合、スレッドは終了しませんか?
スレッドを終了する他の可能性はありますか?
MSDNでは、Thread.Abort()メソッドの説明に次のように記載されています。「このメソッドを呼び出すと、通常はスレッドが終了します。」
なぜいつもではないのですか?
どちらの場合、スレッドは終了しませんか?
スレッドを終了する他の可能性はありますか?
回答:
Thread.Abort()
ThreadAbortException
スレッドにを注入します。スレッドは、を呼び出すことによって要求をキャンセルできThread.ResetAbort()
ます。また、finally
例外が処理される前に実行されるブロックなど、特定のコード部分があります。何らかの理由でスレッドがそのようなブロックでスタックしている場合、例外がスレッドで発生することはありません。
呼び出し元は、呼び出し時にスレッドの状態をほとんど制御Abort()
できないため、通常、そうすることはお勧めできません。代わりに、終了を要求するメッセージをスレッドに渡します。
どちらの場合、スレッドは終了しませんか?
この質問は重複しています。
Thread.Abort()の使用の何が問題になっていますか
スレッドを終了する他の可能性はありますか?
はい。あなたの問題は、丁寧に停止するように言うことができないスレッドを決して開始してはならず、それがタイムリーに停止することです。(1)停止するのが難しい、(2)バグがある、または最悪の場合(3)ユーザーに対して敵対的である可能性があるスレッドを開始する必要がある状況にある場合、正しいことは新しいプロセスで、新しいプロセスでスレッドを開始し、スレッドを停止するときにプロセスを終了します。非協調的なスレッドの安全な終了を保証できる唯一のことは、オペレーティングシステムがプロセス全体を停止することです。
詳細については、この質問に対する私の過度に長い回答を参照してください。
関連するビットは、スレッドを中止する前にスレッドが自殺するのをどのくらい待つ必要があるかに関する考慮事項について説明する最後のビットです。
なぜいつもではないのですか?どちらの場合、それはスレッドを終了しませんか?
手始めに、スレッドはをキャッチしてThreadAbortException
、それ自体の終了をキャンセルする場合があります。または、中止しようとしている間、永遠にかかる計算を実行する可能性があります。このため、ランタイムは、要求した後にスレッドが常に終了することを保証できません。
ThreadAbortException
もっとあります:
スレッドを破棄するためにAbortメソッドが呼び出されると、共通言語ランタイムはThreadAbortExceptionをスローします。ThreadAbortExceptionはキャッチできる特別な例外ですが、catchブロックの最後で自動的に再度発生します。この例外が発生すると、ランタイムはスレッドを終了する前にすべてのfinallyブロックを実行します。スレッドはfinallyブロックで無制限の計算を実行したり
Thread.ResetAbort()
、中止をキャンセルするために呼び出したりできるため、スレッドが終了する保証はありません。
Abort()
手動でスレッド化する必要はありません。スレッド内のメソッドを返すだけで、CLRがすべてのダーティな作業を実行します。これでスレッドは正常に終了します。
スレッドがロックを保持していて、中止/強制終了された場合はどうなりますか?リソースがスタックしたまま
スレッドがそれ自体を中止するが、他のスレッドでは呼び出さない場合は正常に機能します。タスクを完了しておらず、リソースをクリーンアップする機会がない場合でも、影響を受けるスレッドを強制終了します。
参照MSDN
ループでスタックしているスレッドを中止できないようです。
//immortal
Thread th1 = new Thread(() => { while (true) {}});
ただし、ループ中にスリープした場合はスレッドを中止できます。
//mortal
Thread th2 = new Thread(() => { while (true) { Thread.Sleep(1000); }});
ThreadAbortsは、finallyブロック内、またはBeginCriticalRegionとEndCriticalRegionの間では発生しません。
OTは:同時実行に関する包括的な、言語に依存しない、疑わしく役に立つととびきり面白いテイクについては、ヴェリティー・ストブを!