外から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を読むと確かにそう読み取れる。 こんな小ネタ使う日は来ないだろうが面白い。