我读过的所有内容声称线程中止将在从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());
}
Run Code Online (Sandbox Code Playgroud)
我在运行时发现的是控制台从未提到进入finally块.应用程序在.abort调用之后继续,好像根本没有finally块.难道我做错了什么?在到达最终写入控制台之前,不应该控制传递给finally块,还是执行顺序仍然是最终在单独的线程中的事实的函数?