読者です 読者をやめる 読者になる 読者になる

finally 句と ThreadAbort

.NET

相変わらずいい感じに壊れた世界.
ちょっとした実験中に気になった挙動を追いかけてたら,Thread.Abort の説明でこんなことをみつけました.

.NET Framework Version 1.0 および 1.1 では、finally ブロックの実行中にスレッドが中止される場合があります。この場合は finally ブロックが中止されます。

以下のコードは,.NET 1.1 では終了し,.NET 2.0 では停止しなくなったように見えます.

using System;
using System.Threading;

namespace ThreadAbortTest
{
    class Program
    {
        static void Proc()
        {
            try
            {
                try
                {
                }
                finally
                {
                    Thread.Sleep(Timeout.Infinite);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception " + e.ToString());
                throw;
            }
        }
        static void Main(string[] args)
        {
            Thread worker = new Thread( new ThreadStart(Proc) );
            worker.Name = "Worker Thread";
            worker.Start();
            Thread.Sleep(1000);
            worker.Abort();   // ← ここで無限に停止する (.NET Framework 2.0)
            worker.Join(1000);
            Console.WriteLine("Joined");
        }
    }
}

んー,信頼性に関するベスト プラクティス でこのパターン触れてたっけなぁ?