外からThread.Abort()されてもfinally句は最後まで実行される

Reference Source見ていて面白いコードを見つけた。

https://referencesource.microsoft.com/#mscorlib/system/threading/timer.cs,562

// prevent ThreadAbort while updating state
try { }
finally
{
   // 途中で止めたくない処理
}

試してみると確かにThread.Abort()を呼んでもfinally句は最後まで実行されてから終了していた。

static void Main(string[] args)
{
    var thread = new Thread(new ThreadStart(() =>
    {
        Console.WriteLine("Thread start");

        try { }
        finally
        {
            Console.WriteLine("finally start");
            Thread.Sleep(5000);
            Console.WriteLine("finally finish");
        }

        Console.WriteLine("Thread finish");
    }));

    thread.Start();

    Thread.Sleep(1000);

    Console.WriteLine("Abort");
    thread.Abort();

    Thread.Sleep(5000);
}

MSDNを読むと確かにそう読み取れる。 こんな小ネタ使う日は来ないだろうが面白い。

Thread.Abort メソッド (System.Threading)