我读过的所有内容都声称线程中止将在从 ThreadAbortException 结束之前执行 finally 块。我想确认这一点,以便我可以计划如何处理一些可以无限期挂起的第 3 方代码。然而,以下测试让我感到困惑:
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 块。应用程序在 .abort 调用之后继续运行,就好像根本没有 finally 块一样。难道我做错了什么?在到达对控制台的最终写入之前,控制是否不应该传递给 finally 块,或者执行顺序仍然是 finally 在单独的线程中或其他什么事实的函数?