안녕하세요 hayee 입니다.
클라이언트 프로그램 소스 코드 분석 중 개념이 햇갈리는 부분이 있어서 다시 공부를 하였고, 글로 남겨놓으려고 합니다.
◈ 예제 소스 (1) - AutoResetEvent
AutoResetEvent m_autoEvent = new AutoResetEvent(true);
private void btnCreate_Click(object sender, EventArgs e)
{
for (int k = 0; k < 3; k++)
{
Thread th3 = new Thread(() => StartThread3());
th3.Name = "Test thread " + k.ToString();
th3.IsBackground = true;
th3.Start();
}
}
private void btnSet_Click(object sender, EventArgs e)
{
m_autoEvent.Set();
}
private void StartThread3()
{
Trace.WriteLine("thread3 (Name:" + Thread.CurrentThread.Name + ") 대기중");
m_autoEvent.WaitOne();
Trace.WriteLine("thread3 (Name:" + Thread.CurrentThread.Name + ") 신호 받음");
}
- AutoResetEvent(true): 초기 상태를 signal 상태로 만들어 주기 때문에, 스레드가 Block 상태에 있어도 (Waitone) 바로 다음으로 진행할 수 있다.
- AutoResetEvent(false): 초기 상태를 non-signal 상태 이기 때문에, 스레드가 Block 상태에 있으면 (Waitone) 신호를 줘야 (Set) 다음으로 진행할 수 있다.
- Create 버튼을 클릭하여 3개의 스레드를 생성한다. AutoResetEvent(true) 로 초기 상태를 설정하였기 때문에 스레드 생성 후 1개의 스레드만 Block 상태에서 나온 것을 확인할 수 있다.
(AutoResetEvent(false) 로 테스트 한 경우, 생성된 스레드 전부 Block 상태로 있게 된다.)
- Set 버튼을 클릭하면 나머지 Block 상태의 스레드 중 1개의 스레드만 Block 상태에서 나온것을 확인할 수 있다.
◈ 예제 소스 (2) - ManualResetEvent
ManualResetEvent m_manualEvent = new ManualResetEvent(true);
private void btnCreate_manual_Click(object sender, EventArgs e)
{
for (int k = 0; k < 3; k++)
{
Thread th4 = new Thread(() => StartThread4());
th4.Name = "Test thread "+ k.ToString();
th4.IsBackground = true;
th4.Start();
}
}
private void StartThread4()
{
for (int i = 0; i < 2; i++)
{
Trace.WriteLine("thread4 (Name:" + Thread.CurrentThread.Name + ") 대기중");
m_manualEvent.WaitOne();
Trace.WriteLine("thread4 (Name:" + Thread.CurrentThread.Name + ") 신호 받음");
Thread.Sleep(500);
m_manualEvent.Reset();
}
}
private void btnSet_manual_Click(object sender, EventArgs e)
{
m_manualEvent.Set();
}
초기 신호 상태 설정은 AutoResetEvent 와 동일하지만 차이점이 있다.
ManualResetEvent 은 Block 상태를 빠져나온 뒤, 다시 Block 상태로 만들기 위해 수동으로 변경해 줘야 한다. (Reset())
또한 AutoResetEvent는 신호를 줄 때 1개의 스레드에만 적용이 되지만, ManualResetEvent 는 모든 스레드에 신호를 줄 수 있다는 것이다.
# 틀린 부분이 있다면 댓글 부탁드립니다. #
# 댓글 달아주시면 늦게라도 블로그 방문하도록 할게요! 감사합니다. #
'hayee Study > 코딩_c#' 카테고리의 다른 글
[C#] 현재 실행되고 있는 프로그램 경로 설정하기 (60) | 2023.10.14 |
---|---|
[C#] DateTime 에 대하여 (0) | 2023.10.12 |
[C#] show, showDialog (모달리스와 모달 차이점) (2) | 2023.10.03 |
[C#] ProgressBar 사용법. (+ 색상 변경하기) (5) | 2023.10.02 |
[C#] 작업스케줄러 (2) | 2023.10.02 |