스레드 실행을 종료하려면 일반적으로 협조적 취소 모델을 사용합니다. 그러나 협조적 취소를 위해 설계되지 않은 타사 코드를 실행하기 때문에 스레드를 협조적으로 중지할 수 없는 경우도 있습니다. .NET Framework 앱에서 이 메서드를 Thread.Abort 사용하여 관리되는 스레드를 강제로 종료할 수 있습니다.
Abort을 호출할 때, 공용 언어 런타임은 대상 스레드에서 그 스레드가 예외를 잡을 수 있도록 ThreadAbortException을 던집니다. .NET Framework 런타임은 항상 catch 블록 뒤에 예외를 자동으로 다시 throw 합니다. 자세한 내용은 Thread.Abort을 참조하세요.
이 메서드는 .NET Core 및 .NET 5 이상 버전에서 런타임 시 PlatformNotSupportedException을(를) 발생시킵니다. .NET 5부터는 사용되지 않음(SYSLIB0006)으로 표시되기 때문에 호출하면 컴파일 시간 경고가 생성됩니다. 최신 .NET 구현에서 타사 코드의 실행을 강제로 종료해야 하는 경우 별도의 프로세스에서 실행하고 사용합니다 Process.Kill.
메모
- 현재 스레드가 아닌 다른 스레드를 중단하도록 호출 Thread.Abort 할 때 어떤 코드가 실행되었거나 throw될 때 ThreadAbortException 실행하지 못했는지 알 수 없습니다. 또한 애플리케이션의 상태 또는 유지를 담당하는 애플리케이션 및 사용자 상태를 확신할 수 없습니다. 예를 들어 호출 Thread.Abort 은 정적 생성자의 실행 또는 관리되는 리소스 또는 관리되지 않는 리소스의 릴리스를 방지할 수 있습니다.
- 스레드가 메서드를 호출할 때 Abort 관리되지 않는 코드를 실행하는 경우 런타임은 이를 표시합니다 ThreadState.AbortRequested. 스레드가 관리 코드로 돌아올 때 예외가 발생합니다.
스레드가 중단되면 다시 시작할 수 없습니다.
Abort 메서드는 대상 스레드가 ThreadAbortException를 catch하여 finally 블록에서 임의의 양의 코드를 실행할 수 있으므로 스레드를 즉시 중단시키지 않습니다. 스레드가 종료될 때까지 기다려야 하는 경우 호출 Thread.Join 할 수 있습니다.
Thread.Join 는 스레드가 실제로 실행을 중지하거나 선택적 시간 제한 간격이 경과할 때까지 반환되지 않는 차단 호출입니다. 중단된 스레드는 메서드를 ResetAbort 호출하거나 블록에서 finally 바인딩되지 않은 처리를 수행할 수 있으므로 시간 제한을 지정하지 않으면 대기가 종료되지 않습니다.
메서드 호출을 기다리는 스레드는 호출 Thread.JoinThread.Interrupt하는 다른 스레드에 의해 중단될 수 있습니다.
ThreadAbortException 처리
자체 코드에서 Abort를 호출하거나 스레드가 실행 중인 애플리케이션 도메인을 언로드하는 결과로 스레드가 중단될 것으로 예상되는 경우, 스레드는 AppDomain.UnloadThread.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 절의 끝에서 다시 throw하기 때문에, finally 절이 없으면 catch 절의 끝에서 다시 throw됩니다.
Thread.ResetAbort 메서드를 호출하여 시스템이 예외를 다시 던지는 것을 방지할 수 있습니다. 그러나 자신의 코드로 인해 ThreadAbortException가 발생한 경우에만 수행해야 합니다.
참고하십시오
.NET