스레드 임의로 종료하기
Thread.Abort 메서드를 사용해서 강제로 종료할 수 있습니다.
Thread Abort는 .NET 프레임워크에서만 지원됩니다.
사용자는 작업 관리자 등을 이용하여 프로세스를 임의로 죽일 수 있습니다.
아쉽게도 프로세스 안에서 동작하는 각 스레드는 죽일 수 없습니다.
스레드를 죽이려면 앞으로 설명할 Abort를 이용해야 합니다.
static void DoSomething()
{
try
{
for (int i = 0; i < 10000; i++)
{
Console.WriteLine($"DoSomething {i}");
Thread.Sleep(10);
}
}
catch(ThreadAbortException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
Console.WriteLine("End");
}
}
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(DoSomething));
t1.Start();
t1.Abort();
t1.Join();
}
Abort 메서드를 사용할 때는 조심할 점이 있습니다.
Abort 메서드가 실행되었을 때 바로 스레드가 종료되는 것이 아닙니다.
Abort 메서드가 실행되면 ThreadAbortException을 던집니다.
그다음 catch문과 finally문을 실행한 후에야 스레드가 완전히 종료됩니다.
그래서 Abort 메서드를 사용할 때는 나머지 처리 시간을 생각하며 사용해야 합니다.

t1.Abort에서 Abort 메서드를 실행하여 스레드 정지를 시도합니다.
ThreadState
스레드에는 여러 상태가 존재합니다.
시작하는 상태, 대기 상태, 없어진 상태 등등 여러 상태가 존재하죠.
| 상태 | 설명 |
| Unstarted | 스레드 객체가 생성된 후 아무것도 안하고 있는 상태입니다. 즉, 생성만 되었다는 뜻입니다. |
| Running | 스레드가 현재 일을 하는 중일 때 Running 상태가 됩니다. Unstarted 상태인 스레드를 Start()를 통해 Running 상태로 만들 수 있습니다. |
| Suspended | 스레드가 잠시 일을 쉴 때의 상태를 나타냅니다. Thread.Suspend()로 Suspended 상태로 만들 수 있으며, Thread.Resume()을 사용해 다시 Running 상태로 되돌릴 수 있습니다. |
| WaitSleepJoin | 스레드가 블록된 상태입니다. 이는 일을 쉬는 상태랑은 다릅니다. |
| Aborted | 스레드가 일을 하다 오늘 할 일이 사라져버린 상태입니다. 즉 스레드가 취소된 상태입니다. Thread.Abort()를 호출하면 Aborted 상태가 됩니다. 그 다음 Stopped 상태가 되어 완전히 종료됩니다. |
| Stopped | 중지된 스레드 상태입니다. 할 일을 모두 끝냈거나, Aborted 상태에서 넘어왔을 때 Stopped 상태가 됩니다. |
| Background | 스레드가 백그라운드에서 동작하고 있다고 나타냅니다. Thread.IsBackground 속성에 true를 입력하여 스레드를 이 상태로 전환할 수 있습니다. 그럼 Foreground도 존재 할까요? 있다면 Background는 Foreground랑 무슨 차이가 있을까요? |
Foreground VS Background
Foreground인 스레드는 하나라도 살아 있기만 하다면, 프로세스가 절대 종료되지 않습니다.
Background는 하나가 아닌 열 개가 살아 있더라도, 프로세스가 종료되고 실행되는 것에 영향을 주지 않습니다.
하지만 Background는 프로세스가 죽으면 모든 스레드가 종료됩니다.
ThreadState를 어디에 쓰나요? 왜 배우나요?
사실 실제 직무에선 사용하지 않는다고 생각합니다. 왜냐하면 Task / UniTask라고 Unity에서 사용할 수 있는 고성능 API가 존재하기 때문이며, Thread 관리를 거의 직접 하지는 않기 때문입니다.
하지만 스레드 동작 원리를 이해하는 데에 있어서 좋다고 생각하여 배우면 좋다고 생각합니다.
또한 디버깅/ 오류 작업 시 유용하게 활용될 수 있습니다.
Thread는 디버깅이 힘든 작업인데, ThreadState를 알고 있다면, 어느 부분에서 오류가 생겼는지 확인하기 수월해집니다.
저는 이런 이유 때문에 잠시라도 공부하였고, 블로그에 이를 정리한 것입니다.
'C# > 문법' 카테고리의 다른 글
| C# ObserverPattern (옵저버 패턴) (0) | 2025.10.07 |
|---|---|
| C# 프로세스와 스레드 (2) | 2025.08.21 |
| C# object와 박싱, 언박싱 (2) | 2025.08.13 |
| C# 문법 17 -- 데이터 형식 정리 9 (0) | 2024.12.07 |
| C# 문법 16 -- 데이터 형식 정리 8 (0) | 2024.12.06 |