Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 스레드 중단하기: Abort() 메서드 완벽 정리

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 기반의 안전한 취소 방식을 채택하는 것이 바람직합니다.