C# Thread 파해쳐보기

실험용 쓰레드 만들기

우선 실험용으로 5개의 문장을 출력하는 함수를 하나 만들어보자.

static void MainThread(object state)
{
	for (int i = 0; i < 5; i++)
	{
		Console.WriteLine("Hello Thread!");
	}
}

 

쓰레드를 사용해보자

해당 쓰레드를 사용하려면 

Thread t = new Thread(MainThread);

t.Name = "Test Thread";
t.IsBackground = false;
t.Start();

이렇게 불러올 수 있다.

쓰레드 객체 t를 생성하고
이름을 Test Thread로 지정한 다음
Background는 false로 설정한 후
쓰레드를 시작시켰다.

 

1. Thread.Name

쓰레드에도 이름을 지정해줄 수 있다. 이름을 설정해주지 않았다면 null로 설정된다.

쓰레드 네임은 단 한번만! 설정할 수 있고 다시 설정하려고 하면 InvalidOperationException이 발생한다.

설정한 이름은 vs 상단에서 확인할 수 있다.

 

2. Thread.IsBackground

쓰레드는 Background Thread와 Foreground Thread 두 종류가 있다.

가장 큰 차이는 Background Thread의 완료 여부와 상관 없이 프로그램이 종료될 수 있다는 것이다.

기본적으로 false로 설정되어 있다.

 

3. Thread Pooling

원래는 쓰레드를 실행하기 위해 하나하나 쓰레드 객체를 생성하고 실행해야 하지만, C#에도 쓰레드 풀링이 있다.

ThreadPool.QueueUserWorkItem(MainThread);

이렇게 쓰레드풀링을 할 수 있고

ThreadPool.SetMinThreads(1, 1);
ThreadPool.SetMaxThreads(5, 5);

 

SetMinThreads와 SetMaxThreads를 통해 최대 풀링 양을 사용자가 정의할 수 있다.

 

4. Thread.Join

Join은 기본적으로 쓰레드가 실행 완료될 때 까지 쓰레드 호출을 차단하는 함수다.

C# 문서 예제를 참고해보자.

메인 함수에선 각각 Thread1과 Thread2를 순차적으로 실행했다. Thread1은 if문에서 Thread2.Join()에 걸리기 때문에 Thread2가 실행 완료될 때까지 Thread1의 호출은 차단되었다가 실행되는 것을 확인할 수 있다.

 

Task

task를 이용해 비동기적으로 action, function 등 단일 작업을 실행할 수 있고, 결과 값을 받을 수 있다.

아주 오래 걸리는 작업이라면 기존 쓰레드 풀 쓰레드 말고 별도로 관리할 수 있게 TaskCreationOptions.Longrunning으로 설정해야 한다.

Task t = new Task(() => { while (true) { } }, TaskCreationOptions.LongRunning);
t.Start();