我读到的所有资料都声称,在线程上执行的中止操作将在从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 语句块。应用程序在调用 .abort 后继续执行,就好像根本没有 finally 语句块一样。我做错了什么吗?在达到最终的 console 写入之前,控制权不应该传递到 finally 语句块吗?还是执行顺序仍然由 finally 在单独的线程中这个事实所决定的?
测试线程于下午3:21进入FINALLY
的结果。 - Dustin KingenThread.Abort
就像是通过向司机开枪来停止汽车。汽车会停下来,但在此期间可能发生任何事情。你真的不应该永远需要调用Thread.Abort
。如果你这样做了,那么你需要重新审视你的应用程序设计。 - Jim Mischel