C# 멀티스레딩 환경에서 Abort() 메서드는 실행 중인 스레드를 강제로 종료할 때 사용됩니다. 이 글에서는 Abort() 메서드의 동작 원리와 실제 사용 예제를 자세히 살펴보겠습니다.
Abort() 메서드란?
Abort() 메서드는 대상 스레드를 파괴(강제 종료)하는 역할을 합니다. 런타임은 호출된 스레드에 ThreadAbortException을 발생시켜 스레드를 중단시킵니다.
이 예외의 가장 큰 특징은 catch 블록으로 잡을 수 없다는 점입니다. 예외가 발생하면 제어권은 finally 블록으로 넘어가며, finally 블록의 코드는 반드시 실행된 후 스레드가 종료됩니다.
스레드를 중단하는 기본 문법은 다음과 같습니다.
childThread.Abort();
예제 코드
아래 예제는 자식 스레드를 생성해 0부터 10까지 숫자를 출력하다가, 메인 스레드가 5초 후 자식 스레드를 강제로 중단시키는 프로그램입니다.
using System;
using System.Threading;
namespace MultithreadingApplication {
class ThreadCreationProgram {
public static void CallToChildThread() {
try {
Console.WriteLine("자식 스레드 시작");
// 0부터 10까지 카운트하는 작업 수행
for (int counter = 0; counter <= 10; counter++) {
Thread.Sleep(500);
Console.WriteLine(counter);
}
Console.WriteLine("자식 스레드 완료");
} catch (ThreadAbortException e) {
Console.WriteLine("스레드 중단 예외 발생");
} finally {
Console.WriteLine("스레드 예외를 잡을 수 없습니다.");
}
}
static void Main(string[] args) {
ThreadStart childref = new ThreadStart(CallToChildThread);
Console.WriteLine("메인: 자식 스레드 생성");
Thread childThread = new Thread(childref);
childThread.Start();
// 메인 스레드를 잠시 대기
Thread.Sleep(5000);
// 자식 스레드 강제 중단
Console.WriteLine("메인: 자식 스레드 중단 요청");
childThread.Abort();
Console.ReadKey();
}
}
}실행 결과
메인: 자식 스레드 생성 자식 스레드 시작 0 1 2 3 4 5 6 7 8 메인: 자식 스레드 중단 요청 스레드 중단 예외 발생 스레드 예외를 잡을 수 없습니다.
실행 결과 분석
출력 결과를 보면 자식 스레드가 8까지 카운트한 시점에 메인 스레드가 Abort()를 호출했습니다. 그 결과 카운트가 끝나지 않고 즉시 ThreadAbortException이 발생했으며, catch 블록이 예외를 받았지만 실제 스레드 종료 처리는 finally 블록으로 넘어간 것을 확인할 수 있습니다.
주의사항: 최신 .NET에서의 지원 여부
.NET Core 및 .NET 5 이상 버전에서는 Thread.Abort() 메서드가 지원되지 않으며, 호출 시 PlatformNotSupportedException이 발생합니다. 이 메서드는 .NET Framework에서만 동작하며, 안전하지 않은 방식으로 간주되어 폐기(deprecated)되었습니다.
따라서 최신 .NET 환경에서는 다음과 같은 대안을 사용하는 것이 권장됩니다.
- CancellationToken: 협력적 취소(cooperative cancellation) 패턴으로 안전하게 스레드 작업을 중단
- Task와 async/await: 현대적인 비동기 프로그래밍 모델 활용
- 플래그 변수: 스레드 내부에서 주기적으로 확인하여 자체 종료 처리
결론적으로 Abort() 메서드는 레거시 .NET Framework 프로젝트에서만 사용해야 하며, 새 프로젝트에서는 CancellationToken 기반의 안전한 취소 방식을 채택하는 것이 바람직합니다.