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

C#에서 스레드를 안전하게 종료하는 방법

C#에서 실행 중인 스레드를 종료하는 가장 안전하고 권장되는 방식은 강제로 중단시키는 것이 아니라, 플래그(flag) 변수를 활용해 스레드가 스스로 작업을 마치도록 유도하는 것입니다. 이번 글에서는 불리언 플래그와 Stop 메서드를 사용해 스레드의 동작을 우아하게 멈추는 방법을 코드 예제와 함께 살펴보겠습니다.

1단계: 스레드 생성 및 시작

먼저 새로운 스레드를 만들고 시작합니다.

// 새 스레드 생성
Thread thread = new Thread(c.display);
thread.Start();

2단계: 작업 메서드와 종료 메서드 정의

다음으로 스레드가 실행할 메서드를 작성하고, 반복문의 조건으로 사용될 플래그 변수를 제어하는 Stop 메서드를 정의합니다.

public void display() {
    while (!flag) {
        Console.WriteLine("It's Working");
        Thread.Sleep(2000);
    }
}
public void Stop() {
    flag = true;
}

여기서 핵심은 flag 변수입니다. 스레드는 while (!flag) 조건이 참인 동안 계속 작업을 수행하며, Stop 메서드가 호출되어 flag가 true로 변경되면 반복문이 종료되고 스레드도 자연스럽게 끝납니다.

완성된 전체 코드

아래는 C#에서 스레드를 종료하는 방법을 학습할 수 있는 완전한 코드입니다.

using System;
using System.Threading.Tasks;
using System.Threading;
class Demo {    
    static void Main(string[] args){
        MyClass c = new MyClass();
        // 새 스레드 생성
        Thread thread = new Thread(c.display);
        thread.Start();
        Console.WriteLine("Press any key to exit!");
        Console.ReadKey();
        c.Stop();
        thread.Join();
    }
}
public class MyClass {    
    private bool flag = false;    
    public void display() {      
        while (!flag) {          
            Console.WriteLine("It's Working");      
            Thread.Sleep(2000);        
        }    
    }    
    public void Stop() {        
        flag = true;    
    }
}

실행 결과

It's Working
Press any key to exit!

코드 동작 원리

프로그램이 실행되면 스레드가 시작되어 2초 간격으로 "It's Working" 메시지를 출력합니다. 그리고 메인 스레드는 "Press any key to exit!"라는 안내 문구를 표시한 뒤 키 입력을 기다립니다.

사용자가 아무 키나 누르면 다음 순서로 진행됩니다.

1. c.Stop() 호출 → flag 값이 true로 변경
2. 스레드 내부의 while 루프 조건이 거짓이 되어 반복 종료
3. thread.Join() → 메인 스레드가 해당 스레드가 완전히 끝날 때까지 대기한 후 프로그램 종료

마무리 팁

과거에는 Thread.Abort()로 스레드를 강제 종료하기도 했지만, 이 방식은 리소스가 적절히 해제되지 않는 등의 부작용이 있어 현재는 권장되지 않습니다. 위 예제처럼 플래그 기반의 협조적 종료(cooperative cancellation) 방식을 사용하면 스레드가 안정적으로 종료되며, 필요에 따라 CancellationTokenTask를 활용하는 것도 좋은 대안입니다.