Thread의 기본 생성
- Thread 생성시 넣은 함수가 종료되면 Thread도 같이 종료된다.
static void MainTread()
{
Console.WriteLine("Hello Thread");
}
static void Main(string[] args)
{
// Thread 생성 (생성된 Thread가 동작시킬 함수)
Thread t = new Thread(MainTread);
// Thread 시작
t.Start();
Console.WriteLine("Hello world");
}
C#의 Thread는 Default로 Foreground로 생성된다.
- 이 경우 Thread가 종료되지 않으면 프로그램이 종료되지 않는다.
- isBackground = true 해줄 경우 Thread가 background로 실행되기 때문에 프로그램 종료와 함께 종료된다.
static void MainTread()
{
while(true)
Console.WriteLine("Hello Thread");
}
static void Main(string[] args)
{
// Thread 생성 (생성된 Thread가 동작시킬 함수)
Thread t = new Thread(MainTread);
t.IsBackground = true;
// Thread 시작
t.Start();
Console.WriteLine("Hello world");
}
Thread가 Background로 실행되고 있어도 Join()함수를 통해 해당 Thread가 종료될때까지 프로그램을 대기시킬 수 있다.
static void MainTread()
{
while(true)
Console.WriteLine("Hello Thread");
}
static void Main(string[] args)
{
// Thread 생성 (생성된 Thread가 동작시킬 함수)
Thread t = new Thread(MainTread);
t.IsBackground = true;
// Thread 시작
t.Start();
Console.WriteLine("Waiting for Thread");
// background Thread가 종료될때 까지 대기
t.Join();
Console.WriteLine("Hello world");
}
디버깅을 통해 현재 Thread상태 확인하기
- 프로그램 실행중 "정지"버튼을 누르고 Thread를 선택하면 해당 Thread의 동작지점이 표시된다.
Thread Pool
- 프로그램 동작 중 간단한 작업을 위해 잦은 Thread 생성이 필요한 경우 사용하면 좋음.
- C#에서 미리 Poolling해둔 Thread를 가져다가 사용하고 해당 Thread가 종료되면 자동으로 Pool로 반납됨
- 대신 ThreadPool에서 가져온 Thread를 오래 사용할 경우 ThreadPool로 반납이 안되어, ThreadPool의 Thread가 부족해질 수 있고, 그럴경우 ThreadPool이 동작하지 않는 상황 발생.
- 그래서 간단한 작업을 할때 사용하자.
static void MainTread(object state)
{
for(int i = 0; i<5; ++i)
Console.WriteLine("Hello Thread");
}
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(MainTread);
while (true)
{
}
}
Task
- TheadPool에서 Thread를 할당 받아 사용.
- 하지만 Task생성시 옵션으로 "TaskCreationOptions.LongRunning"을 설정해 줄 경우 ThreadPool에서 할당하지 않고 별도의 Thread를 생성하여 할당하기 때문에 Thread Pool의 부족현상을 해결 할 수 있다.
- "TaskCreationOptions.LongRunning" 옵션을 넣지 않으면 ThreadPool에서 할당한다.
- 따라서 Task위주로 Thread를 활용하고 오래걸리는 작업일 경우 Task생성시 "TaskCreationOptions.LongRunning"를 넣어주자.