私が読んだものはすべて、スレッドの中止が ThreadAbortException から終了する前に finally ブロックを実行すると主張しています。無期限にハングする可能性のあるサードパーティのコードを処理する方法を計画できるように、これを確認したかったのです。ただし、次のテストでは混乱します。
public void runTest(DateTime deadline)
{
testThread = new Thread(() =>
{
try
{
Console.WriteLine("test thread started at " + DateTime.Now.ToShortTimeString());
while (true) { }
}
finally
{
Console.WriteLine("test thread entered FINALLY at " + DateTime.Now.ToShortTimeString());
while (true) { }
}
});
testThread.Start();
while (testThread.IsAlive && deadline.Subtract(DateTime.Now).TotalSeconds > 0)
{
Console.WriteLine("main thread while loop " + DateTime.Now.ToShortTimeString());
Thread.Sleep(10000);
}
if (testThread.IsAlive)
testThread.Abort();
Console.WriteLine("main thread after abort call " + DateTime.Now.ToShortTimeString());
}
これを実行したときにわかったのは、コンソールが finally ブロックに入ることについて言及していないことです。アプリケーションは、finally ブロックがまったくないかのように、.abort 呼び出しの後も続行します。私は何か間違ったことをしていますか?コンソールへの最終的な書き込みに到達する前に、finally ブロックへの制御パスを渡すべきではありませんか、それとも実行順序はまだ、finally が別のスレッドか何かにあるという事実の関数ですか?