如何正确处理ThreadInterruptedException?

时间:2010-07-22 21:17:26

标签: .net exception-handling finally

public void threadMethod() 
{
    try
    {
        // do something
    }    
    catch (ThreadInterruptedException e)
    {
        Console.WriteLine("[Net]", role, "Thread interrupted.");
        n.CloseConnection();
    }
    finally
    {
        if (isAutenticated == false)
        {
            n.CloseConnection();
        }

        Dispatcher.Invoke(addMessage, "Network connection searching was disabled.");
        DebuggerIX.WriteLine("[Net]", role, "Finished");
        Dispatcher.Invoke(threadStoppedDel);
    }
}

方法 threadMethod 通过 System.Threading.Thread 运行。线程可能会被中断,因此可能会在finally块中抛出异常 ThreadInterruptedException ,对吗?我是否必须再次将该块封装在try-catch中?

谢谢!

1 个答案:

答案 0 :(得分:7)

当线程被手动调用Thread.Interrupt中断时,抛出线程中断的异常。 Windows本身不会使用该方法中断您的线程。通常,您的程序将控制线程何时发送中断信号(而不是所有时间)。由于中断信号可用于某些流量控制,因此通常不会连续两次发送。

  

在中断的线程中抛出ThreadInterruptedException,但直到线程阻塞。如果线程永远不会阻塞,则永远不会抛出异常,因此线程可能会完成而不会被中断。

如果您的线程从不休眠或等待其他对象(进入WaitSleepJoin状态),您将永远不会看到抛出的异常。

保护您的线程应该是可以接受的。不要忘记也可以抛出一个ThreadAbortException,并且它们会更加普遍,并且可以更频繁地抛出(应用程序正在关闭等)。