C#에서 스레드를 종료하는 방법
C#에서는 Abort() 메서드를 사용하여 실행 중인 스레드를 강제로 종료(파괴)할 수 있습니다.
런타임은 대상 스레드에 ThreadAbortException을 던지는 방식으로 스레드를 중단시킵니다. 특징적인 점은 이 예외가 catch 블록으로 완전히 처리될 수 없다는 것입니다. finally 블록이 존재하면 제어가 반드시 해당 블록으로 넘어가며, 여기서 리소스 정리 등 마무리 작업을 수행할 수 있습니다.
예제 코드
다음 예제는 자식 스레드를 생성한 뒤, 일정 시간 후에 Abort() 메서드를 호출하여 스레드를 종료하는 과정을 보여줍니다.
using System;
using System.Threading;
namespace MultithreadingApplication {
class ThreadCreationProgram {
public static void CallToChildThread() {
try {
Console.WriteLine("Child thread starts");
// 0부터 10까지 카운트하는 작업 수행
for (int counter = 0; counter <= 10; counter++) {
Thread.Sleep(500);
Console.WriteLine(counter);
}
Console.WriteLine("Child Thread Completed");
} catch (ThreadAbortException e) {
Console.WriteLine("Thread Abort Exception");
} finally {
Console.WriteLine("Couldn't catch the Thread Exception");
}
}
static void Main(string[] args) {
ThreadStart childref = new ThreadStart(CallToChildThread);
Console.WriteLine("In Main: Creating the Child thread");
Thread childThread = new Thread(childref);
childThread.Start();
// 메인 스레드를 잠시 대기
Thread.Sleep(2000);
// 자식 스레드 강제 종료
Console.WriteLine("In Main: Aborting the Child thread");
childThread.Abort();
Console.ReadKey();
}
}
}
실행 결과
In Main: Creating the Child thread
Child thread starts
0
1
2
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception
코드 동작 방식 설명
1. 자식 스레드 생성 및 시작
Main 메서드에서 ThreadStart 델리게이트를 통해 자식 스레드를 생성하고 Start() 메서드로 실행합니다. 자식 스레드는 500ms 간격으로 0부터 10까지 숫자를 출력합니다.
2. 스레드 강제 종료
메인 스레드는 2초간 대기한 후 childThread.Abort()를 호출합니다. 이 시점에 자식 스레드는 카운트 도중(2 출력 이후) 강제로 중단됩니다.
3. 예외 처리 흐름
Abort() 호출로 인해 자식 스레드 내부에서 ThreadAbortException이 발생하고, catch 블록이 실행된 뒤 finally 블록까지 반드시 실행되는 것을 결과에서 확인할 수 있습니다.
참고: 최신 .NET 환경에서의 주의사항
Thread.Abort()는 .NET Framework에서만 정상적으로 동작하며, .NET Core 및 .NET 5 이상에서는 PlatformNotSupportedException이 발생합니다. 또한 스레드를 임의의 지점에서 강제 종료하는 것은 데이터 손상이나 교착 상태를 유발할 수 있어 위험한 방식으로 간주됩니다.
따라서 현대적인 C# 개발에서는 Task와 CancellationToken을 활용한 협력적 취소(Cooperative Cancellation) 패턴을 사용하는 것이 권장됩니다. 스레드가 안전하게 종료 조건을 스스로 확인하고 정리 작업을 거친 후 종료되도록 설계하는 것이 훨씬 안정적입니다.