스레드 삭제

스레드의 실행을 종료하려면 일반적으로 협조적 취소 모델을 사용합니다. 그러나 경우에 따라서는 스레드를 함께 중지할 수 없는데, 이는 스레드를 함께 취소하도록 설계되지 않은 타사 코드를 실행하기 때문입니다. .NET Framework 앱에서 Thread.Abort 메서드를 사용하여 관리되는 스레드를 강제로 종료할 수 있습니다. Abort를 호출할 때 공용 언어 런타임이 대상 스레드에서 ThreadAbortException을 throw하며, 대상 스레드가 이를 catch할 수 있습니다. (그러나 .NET Framework 런타임은 항상 catch블록 뒤의 예외를 자동으로 다시 발생시킵니다.) 자세한 내용은 Thread.Abort를 참조하세요.

Thread.Abort 메서드는 .NET Core를 포함하여 .Net 5이상 버전에서 지원되지 않습니다. .NET 5 이상에서 강제로 타사 코드 실행을 종료해야 하는 경우 별도의 프로세스에서 실행하고 Process.Kill을 사용합니다.

참고 항목

  • 현재 스레드가 아닌 다른 스레드를 중단하기 위해 Thread.Abort를 호출하는 경우 ThreadAbortException이 throw될 때 실행되었거나 실행하지 못한 코드를 알 수 없습니다. 또한 애플리케이션의 상태 또는 유지를 담당하는 애플리케이션 및 사용자 상태를 확신할 수 없습니다. 예를 들어 Thread.Abort를 호출하면 정적 생성자가 실행되거나 관리되거나 관리되지 않는 리소스가 해제되지 않을 수 있습니다.
  • Abort 메서드가 호출될 때 스레드가 비관리 코드를 실행하는 경우 런타임은 이를 ThreadState.AbortRequested로 표시합니다. 스레드가 관리 코드로 돌아오면 예외가 throw됩니다.

스레드가 중단되면 다시 시작할 수 없습니다.

대상 스레드가 ThreadAbortException를 catch하고 finally 블록에서 임의의 코드를 실행할 수 있으므로 Abort 메서드로 인해 스레드가 즉시 중단되지 않습니다. 스레드가 종료될 때까지 기다려야 하는 경우 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.  

ThreadAbortExceptionfinally 절의 끝에서 또는 finally 절이 없는 경우 catch 절의 끝에서 시스템을 통해 다시 throw되므로 정리 코드가 catch 절 또는 finally 절에 있어야 합니다.

Thread.ResetAbort 메서드를 호출하여 시스템이 예외를 다시 throw하지 않도록 할 수 있습니다. 그러나 사용자의 코드가 ThreadAbortException을 발생시킨 경우에만 이를 수행해야 합니다.

참고 항목