Как правильно обрабатывать ThreadInterruptedException? - PullRequest
7 голосов
/ 23 июля 2010
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 . Поток может быть прерван всякий раз, когда поэтому исключение ThreadInterruptedException может быть брошено в блок finally, верно? Должен ли я снова заключить блок в try-catch?

Спасибо!

1 Ответ

7 голосов
/ 23 июля 2010

Исключение прерывания потока выдается, когда поток прерывается путем ручного вызова Thread.Interrupt .Сама Windows не будет прерывать ваш поток, используя этот метод.Обычно ваша программа контролирует, когда потоку посылается сигнал прерывания (не всегда).Так как сигнал прерывания может использоваться для некоторого управления потоком, он обычно не отправляется дважды в быстрой последовательности.

ThreadInterruptedException генерируется в прерванном потоке, но не до тех пор, пока поток не заблокируется.Если поток никогда не блокируется, исключение никогда не генерируется, и, таким образом, поток может завершиться без прерывания.

Если ваш поток никогда не спит или ожидает других объектов (вход в состояние WaitSleepJoin), вы 'Вы никогда не увидите выброшенное исключение.

Защита вашей ветки должна быть приемлемой.Не забывайте, что исключение ThreadAbortException также может создаваться, и оно немного более распространено и может создаваться чаще (приложение закрывается и т. Д.).

...