我一直在寻找MSDN,并且无法找到为什么Thread在finally块内睡眠时无法中断的原因。我试过中止没有成功。
在finally块中睡觉时,有没有办法唤醒线程?
Thread t = new Thread(ProcessSomething) {IsBackground = false};
t.Start();
Thread.Sleep(500);
t.Interrupt();
t.Join();
private static void ProcessSomething()
{
try { Console.WriteLine("processing"); }
finally
{
try
{
Thread.Sleep(Timeout.Infinite);
}
catch (ThreadInterruptedException ex)
{
Console.WriteLine(ex.Message);
}
}
}
令人惊讶的是MSDN声称线程可以在finally块中止:http://msdn.microsoft.com/en-us/library/aa332364(v=vs.71).aspx “当finally块正在运行时,线程有可能中止,在这种情况下,finally块将被中止。”
修改 我发现Hans Passant评论是最佳答案,因为这解释了为什么Thread有时可以也不能在finally块中被中断/中止。那就是流程正在关闭的时候。 感谢
答案 0 :(得分:9)
答案 1 :(得分:4)
finally
块的重点是保存一些不受中断或中止影响的内容,无论如何都会运行到正常完成状态。允许finally
块被中止或中断将几乎打败这一点。可悲的是,正如您所指出的,finally
块可能因各种竞争条件而中止或中断。这就是为什么你会看到很多人建议你不要打断或中止线程。
相反,使用合作设计。如果一个线程应该被中断,而不是调用Sleep
,请使用定时等待。而不是调用Interrupt
信号线程等待的东西。