为什么在finally块中睡眠时线程不会被中断

时间:2011-08-15 12:19:45

标签: c# multithreading interrupted-exception

我一直在寻找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块中被中断/中止。那就是流程正在关闭的时候。 感谢

2 个答案:

答案 0 :(得分:9)

答案 1 :(得分:4)

finally块的重点是保存一些不受中断或中止影响的内容,无论如何都会运行到正常完成状态。允许finally块被中止或中断将几乎打败这一点。可悲的是,正如您所指出的,finally块可能因各种竞争条件而中止或中断。这就是为什么你会看到很多人建议你不要打断或中止线程。

相反,使用合作设计。如果一个线程应该被中断,而不是调用Sleep,请使用定时等待。而不是调用Interrupt信号线程等待的东西。