Thread.Sleep(ms)
- 주어진 시간 ( millisecond ) 만큼 스레드를 멈춘다.
기본 형태
new Thread(() =>
{
// 실행하고자 하는 함수가 들어간다.
}).Start();
- Thread를 생성하고 실행하는 기본적인 형태.
- Thread 클래스는 시작 메소드인 Start 와 종료를 기다리는 Join 메소드를 가지고 있다.
- Join 메소드에 밀리세컨드를 지정해 멈출 시간을 정할수 있다.
- 쓰레드 내부에서 자기자신을 받기 위해 Thread.CurrentThread 를 사용할수 있다.
- Background 를 True로 함으로, 백그라운드 스레드로 실행되게 할수 있다.
- 메인스레드/포그라운드 스레드 종료시 같이 종료된다.
- IsAlive 를 통해 실행 여부를 확인할수 있다.
TaskCompletionSource
var taskCompletionSource = new TaskCompletionSource<bool>();
// 위와 같이 지정한다, 제네릭 타입의 경우 최종적으로 받아올 값을 설정하면 된다.
taskCompletionSource.TrySetResult(true);
// 우선되어야 하는 작업을 먼저 끝낸 후 위와 같이 값을 설정해주면
var test = await taskCompletionSource.Task;
// SetResult가 되기 직전까지 여기에서 await하다 값을 받아서 다음 코드를 실행하게 된다.
ThreadPool
- Thread의 갯수를 관리한다.
- ThreadPool.QueueUserWorkItem(실행시킬 함수) 를 통해 콜백 함수를 큐에 대기시킨다.
- 백그라운드 스레드로 실행되기에, 메인 스레드가 종료되면 같이 종료된다.
Thread Lock
- 특정 부분에 한 스레드만 접근할수 있도록 한다.
class Data
{
private object obj = new object();
public int num = 0;
public void Increase()
{
lock (obj)
{
this.num++;
Thread.Sleep(5);
}
}
}
- 일종의 자물쇠 역할을 하는 object를 생성한 뒤
- lock을 통해 한 스레드만 접근할수 있도록 설정 한 모습이다.
세마포어
_resourcePool = new Semaphore(0, 3);
// 0 ~ 3 개의 스레드를 실행할수 있는 세마포어
_resourcePool.Release(3);
// 세마포어의 값을 3으로 바꾸는 코드
_resourcePool.WaitOne();
// 스레드 실행 이전에 대기하는 코드, 세마포어 값이 증가하면 1을 줄이고 실행
_resourcePool.Release();
// 세마포어의 실행이 끝나면 실행, 세마포어 값을 1 증가시킨다.