По-прежнему ли ThreadAbortException принудительно выполняет код в разделе finally (try / catch)?

StackOverflow https://stackoverflow.com/questions/6099382

Вопрос

У меня есть System.Timers.Timer таймер, который это AutoReset установлено значение false.Я использую try/finally чтобы застраховать я Start таймер в конце этого callback (Я использую таймер таким образом, чтобы предотвратить перекрытие callback исполнение).Код:

// inside timer call back
try
{
    // Do something
}
finally
{
    timer.Start(); // Is this line always executed?
}

Мой вопрос заключается в том, что произойдет, если выполняющийся поток Aborted?Делает ли finally раздел все еще выполняется или нет потока для запуска этой части?

Это было полезно?

Решение

Да, эта строка всегда будет выполняться, а прерывание заблокировано до тех пор, пока код в finally предложение заканчивается.

Другие советы

Официальный источник...

Когда выполняется вызов метода Abort для уничтожения потока, обычная языковая среда выполнения выдает Исключение ThreadAbortException.Исключение ThreadAbortException является особым исключение, которое может быть перехвачено, но оно будет автоматически вызвано снова в конце блока catch.Когда возникает это исключение, среда выполнения выполняет все блоки finally перед завершением потока.Потому что поток может выполнять неограниченные вычисления в блоках finally или вызывать Нитки.ResetAbort для отмены прерывания, нет гарантии, что поток когда-либо завершится.Если вы хотите подождать пока прерванный поток не завершится, вы можете вызвать Thread.Метод Join.Join - это блокирующий вызов, который не выполняет возврат до тех пор, пока поток фактически не остановится выполнение.

Подробнее об этом читайте на MSDN.

Сказал тот Документация (эмпасис майн):

Когда этот метод вызывается в потоке, система генерирует ThreadAbortException в потоке, чтобы прервать его.ThreadAbortException - это специальное исключение, которое может быть перехвачено кодом приложения, но повторно генерируется в конце блока catch, если не вызван ResetAbort .ResetAbort отменяет запрос на прерывание и предотвращает завершение потока с помощью ThreadAbortException. Неисполненные блоки finally выполняются до того, как поток будет прерван.

Поток не гарантированно прервется немедленно или вообще.Эта ситуация может возникнуть, если поток выполняет неограниченный объем вычислений в блоках finally, которые вызываются как часть процедуры прерывания, тем самым на неопределенный срок откладывая прерывание.Чтобы дождаться прерывания потока, вы можете вызвать метод Join в потоке после вызова метода Abort, но нет никакой гарантии, что ожидание закончится.

Итак, ответ - да, блоки finally будут выполнены.

Да, тот finally всегда будет использоваться независимо от того, как он выходит из try,

 Whereas catch is used to handle exceptions that occur in a statement block, 
 finally is used to guarantee a statement block of code executes regardless 
 of how the preceding try block is exited.

Подробнее читайте об этом на MSDN.

если поток уже был прерван, блок catch и блок finally могут продолжить выполнение.

Пожалуйста, перейдите по этой ссылке, чтобы получить четкое представление о том, как это обрабатывается в классе system.threading Заполнение глубин ThreadAbortException ThreadAbortException

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top