【发布时间】:2014-10-22 22:14:45
【问题描述】:
当调用 Thread.Abort() 并且该线程正在执行 finally 块时,线程不会中止,直到 finally 块完成。但是,正如我所见,ThreadAbortException 不是在 finally 块结束之后生成的,而是在一些延迟之后生成的:
private static volatile int val1 = 0;
public static void Func1()
{
try
{
}
finally
{
Thread.Sleep(5000);
}
//Func2();
while (true)
val1++;
}
public static void Main()
{
var thread = new Thread(Func1);
thread.Start();
Thread.Sleep(1000);
thread.Abort();
thread.Join();
Console.WriteLine(val1); // val1 is non-zero!
}
在此示例中,Main() 末尾的 val1 将非零。为什么会这样?
如果我取消注释对 Func2() 的调用(Func2 是任何方法,可能为空),val1 的输出将显示“0”。为什么添加方法会影响线程中止点?
【问题讨论】:
-
有趣的问题,但是在没有附加调试器的发布模式下,我可以得到一个非零数字
val1也Func2()未注释的空函数。在发布时附加调试器或在没有调试器的情况下调试时都给我 0。 -
Thread.Abort很糟糕,非常很糟糕。它将使您的应用程序处于不可预测的状态,并且您在使用后将无法依赖关于程序行为的常见假设。你应该avoid不惜一切代价打电话给它。
标签: c# multithreading abort finally