Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Для завершения выполнения потока обычно используется модель совместной отмены. Однако иногда невозможно остановить поток совместно, так как он запускает сторонний код, не предназначенный для совместной отмены. В приложениях .NET Framework можно использовать Thread.Abort метод для принудительного завершения управляемого потока. При вызове Abort среда общего языка исполнения (CLR) генерирует ThreadAbortException в целевом потоке, который этот поток может поймать. (Однако среда выполнения .NET Framework всегда автоматически повторно генерирует исключение после catch блока.) Дополнительные сведения см. в разделе Thread.Abort.
Метод Thread.Abort вызывает исключение PlatformNotSupportedException во время выполнения в .NET Core и .NET 5 и более поздних версиях. Начиная с .NET 5, он также помечен как устаревший (SYSLIB0006), поэтому вызов вызывает предупреждение во время компиляции. Если необходимо принудительно завершить выполнение стороннего кода в современных реализациях .NET, запустите его в отдельном процессе и используйте Process.Kill.
Замечание
- При вызове Thread.Abort чтобы завершить поток, не являющийся текущим, вы не знаете, какой код выполнен или не выполнен, когда происходит ThreadAbortException. Вы также не можете быть уверены в состоянии вашего приложения или состоянии любого другого приложения, за сохранение которого оно несет ответственность. Например, вызов Thread.Abort может препятствовать выполнению статических конструкторов или выпуску управляемых или неуправляемых ресурсов.
- Если поток выполняет неуправляемый код при вызове метода 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.