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

C#에서 스레드가 활성 상태인지 확인하는 방법 – IsAlive 속성 완벽 정리


C#에서 어떤 스레드가 지금 실행 중인지, 즉 활성(alive) 상태인지 확인하려면 Thread.IsAlive 속성을 사용하면 됩니다. 이 속성은 스레드가 이미 시작되었고 아직 종료되거나 중단되지 않았다면 true를, 그렇지 않다면 false를 반환합니다.

예제 1 – IsAlive와 주요 스레드 속성 확인하기

다음 예제는 IsAlive뿐만 아니라 스레드의 현재 상태, 고유 식별자, 백그라운드 스레드 여부까지 한 번에 출력합니다.

using System;
using System.Threading;

public class Demo {
   public static void Main() {
      Thread thread = new Thread(new ThreadStart(demo1));
      thread = Thread.CurrentThread;

      Console.WriteLine("스레드가 활성 상태입니까? = " + thread.IsAlive);
      ThreadPool.QueueUserWorkItem(new WaitCallback(demo2));
      Console.WriteLine("스레드의 현재 상태 = " + thread.ThreadState);
      Console.WriteLine("ManagedThreadId = " + thread.ManagedThreadId);

      thread.IsBackground = true;
      Console.WriteLine("백그라운드 스레드입니까? = " + thread.IsBackground);
   }

   public static void demo1() {
      Thread.Sleep(2000);
   }

   public static void demo2(object stateInfo) {
      Console.WriteLine("관리되는 스레드 풀 소속입니까? = " + Thread.CurrentThread.IsThreadPoolThread);
   }
}

출력 결과

스레드가 활성 상태입니까? = True
스레드의 현재 상태 = Running
ManagedThreadId = 775
백그라운드 스레드입니까? = True
관리되는 스레드 풀 소속입니까? = True

※ ManagedThreadId 값은 프로그램을 실행할 때마다 달라질 수 있습니다.

코드에서 사용된 주요 속성 정리

  • IsAlive – 스레드가 시작된 후 아직 종료(Stopped)되거나 중단(Aborted)되지 않았으면 true를 반환합니다.
  • ThreadState – Unstarted, Running, WaitSleepJoin, Stopped 등 스레드의 현재 실행 상태를 나타냅니다.
  • ManagedThreadId – 관리되는 런타임(.NET CLR) 내에서 각 스레드에 고유하게 부여되는 식별자입니다.
  • IsBackground – 백그라운드 스레드이면 true입니다. 백그라운드 스레드는 모든 포그라운드 스레드가 종료되면 프로세스와 함께 자동으로 중단됩니다.
  • IsThreadPoolThread – 해당 스레드가 .NET 관리 스레드 풀에 속해 있으면 true를 반환합니다.

예제 2 – 새로 시작한 스레드의 활성 여부 확인

이번에는 new Thread()로 직접 생성한 스레드를 시작한 뒤 IsAlive를 확인하고, 해당 스레드가 스레드 풀에 속하는지도 함께 살펴보겠습니다.

using System;
using System.Threading;

public class Demo {
   public static void Main() {
      Thread thread = new Thread(new ThreadStart(demo));
      thread.Start();

      Console.WriteLine("스레드가 활성 상태입니까? " + thread.IsAlive);
   }

   public static void demo() {
      Console.WriteLine("관리되는 스레드 풀 소속입니까? = " + Thread.CurrentThread.IsThreadPoolThread);
   }
}

출력 결과

스레드가 활성 상태입니까? True
관리되는 스레드 풀 소속입니까? = False

직접 생성해 시작한 스레드는 스레드 풀이 아니기 때문에 IsThreadPoolThreadFalse로 출력됩니다. 반면 예제 1에서 ThreadPool.QueueUserWorkItem으로 실행한 작업은 스레드 풀 스레드에서 동작하므로 True가 출력됩니다.

정리 및 참고 사항

스레드의 활성 여부를 확인하는 가장 간단한 방법은 IsAlive 속성을 사용하는 것입니다. 다만 IsAlive를 확인하는 시점과 실제로 그 결과를 활용하는 시점 사이에 스레드 상태가 변경될 수 있으므로(경합 조건), 스레드가 끝날 때까지 기다려야 한다면 thread.Join() 메서드를 사용하는 것이 더 안전합니다.