Поделиться через


Уничтожение потоков

Обновлен: Ноябрь 2007

Для останова выполнения управляемого потока без возобновления используется метод Abort. При вызове метода Abort среда CLR выдает в целевом потоке исключение ThreadAbortException, которое он может перехватить. Дополнительные сведения см. в разделе Thread.Abort.

cyayh29d.alert_note(ru-ru,VS.90).gifПримечание.

Если в потоке при вызове его метода Abort выполняется неуправляемый код, среда выполнения отмечает его как ThreadState.AbortRequested. Это исключение выдается при возврате потока в управляемый код.

Если потока прерван, его невозможно перезапустить.

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

Потоки, ожидающие вызова метода Thread.Join, могут быть прерваны другими потоками, вызывающими метод Thread.Interrupt.

Обработки исключения ThreadAbortException

Если ожидается прерывание потока в результате вызова метода Abort из собственного кода или выгрузки домена приложения, в котором выполняется поток (метод AppDomain.Unload использует для завершения потоков перегруженный метод Thread.Abort), в потоке должен обрабатываться исключение ThreadAbortException, а также должна выполняться завершающая обработка в предложении finally.

Try
    ' Code that is executing when the thread is aborted.
Catch ex As ThreadAbortException
    ' Clean-up code can go here.
    ' If there is no Finally clause, ThreadAbortException is
    ' re-thrown by the system at the end of the Catch clause. 
Finally
    ' Clean-up code can go here.
End Try
' Do not put clean-up code here, because the exception 
' is rethrown at the end of the Finally clause.
try 
{
    // Code that is executing when the thread is aborted.
} 
catch (ThreadAbortException ex) 
{
    // Clean-up code can go here.
    // If there is no Finally clause, ThreadAbortException is
    // re-thrown by the system at the end of the Catch clause. 
}
// Do not put clean-up code here, because the exception 
// is rethrown at the end of the Finally clause.

Код очистки должен находиться в предложении catch или finally, поскольку система повторно выдает исключение ThreadAbortException в конце предложения finally или в конце предложения catch, если предложение finally отсутствует.

Можно блокировать повторную выдачу исключения системой путем вызова метода Thread.ResetAbort. Однако это следует делать только в том случае, если исключение ThreadAbortException было вызвано собственным кодом.

См. также

Ссылки

ThreadAbortException

Thread

Другие ресурсы

Использование потоков и работа с потоками