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

C#에서 스레드를 강제로 종료하는 방법 (Thread.Abort 완벽 가이드)

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) 패턴을 사용하는 것이 권장됩니다. 스레드가 안전하게 종료 조건을 스스로 확인하고 정리 작업을 거친 후 종료되도록 설계하는 것이 훨씬 안정적입니다.