Thread.Abort呼出

Thread.Abortは非同期的に動作する。

  1. Thread.Abort呼出
  2. スレッドにAbortRequestedフラグを設定して制御を戻す。
  3. スレッド強制終了を検出した際、CLRはスレッドを「安全な場所」に置く。
    • スリープ・待機などのブロック処理をおこなっている場合、安全な場所に置かれる。
    • スレッドは乗っ取りにより安全な場所に囲うことができる。
    • 以下の場合、安全な場所にはない。
      • クラスコンストラク
      • catchブロック/finally部録のコードの中
      • クリティカルな実行領域
      • アンマネージコード実行中
  4. 安全な場所に置かれるとCLRはAbortRequestedフラグが設定されていることを検出
  5. 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でのログも出力されている。