Thread.Abort呼出
Thread.Abortは非同期的に動作する。
- Thread.Abort呼出
- スレッドにAbortRequestedフラグを設定して制御を戻す。
- スレッド強制終了を検出した際、CLRはスレッドを「安全な場所」に置く。
- スリープ・待機などのブロック処理をおこなっている場合、安全な場所に置かれる。
- スレッドは乗っ取りにより安全な場所に囲うことができる。
- 以下の場合、安全な場所にはない。
- クラスコンストラクタ
- catchブロック/finally部録のコードの中
- クリティカルな実行領域
- アンマネージコード実行中
- 安全な場所に置かれるとCLRはAbortRequestedフラグが設定されていることを検出
- AbortExceptionをスレッド
ThreadAbortExceptionの再スロー
コードがThreadAbortExceptionを捕捉しても、catchブロックの最後で自動的にAbortExceptionを再スローする。
サンプル
static void Main(string[] args) { Thread t = new Thread(new ThreadStart(Foo)); t.Start(); Thread.Sleep(5); Console.WriteLine("Thread Abort"); t.Abort(); Console.ReadLine(); } static void Foo() { try { Bar(); } catch (ThreadAbortException tae) { Console.WriteLine("Foo catch:" + tae.GetType().Name); } } static void Bar() { try { while (true) { Thread.Sleep(10); } } catch (ThreadAbortException tae) { Console.WriteLine("Bar catch:" + tae.GetType().Name); } }
実行結果。
Thread Abort Bar catch:ThreadAbortException Foo catch:ThreadAbortException
Barはcatchで再スローしていないが、メソッドFooのcatchでのログも出力されている。