finally 句と ThreadAbort
相変わらずいい感じに壊れた世界.
ちょっとした実験中に気になった挙動を追いかけてたら,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"); } } }
んー,信頼性に関するベスト プラクティス でこのパターン触れてたっけなぁ?