[C# 문법] C# Thread(스레드) ManualResetEvent 이용하여 신호대기 하기
- C#/C# 문법
- 2020. 11. 11. 00:00
안녕하세요.
오늘은 C# 문법에서 ManualResetEvent 사용 방법에 대해서 알려 드리려고 합니다.
C# 프로그래밍을 하면서 스레드를 여러 개 사용하다 보면, 종종 다른 어떤 스레드스 신호줄 때 까지 다른 스레드를 대기 상태로 두어야 할 때가 있는데요.
이런 상황에서 사용되는 수단이 바로 ManualResetEvent 입니다. 하나의 스레드에서 ManualResetEvent 객체에 대해 WaitOne을 호출하면, 그 스레드는 다른 스레드가 Set을 호출할 때까지 기다리게 되는데요.
이렇게 말로 설명을 드리면 당연히 이해하기 어렵다고 생각합니다. 그럼 바로 예제를 통해서 ManualResetEvent 를 사용해 보도록 하겠습니다.
예제 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
using System;
using System.Threading;
namespace ThreadTest
{
class Program
{
static void Main(string[] args)
{
// ManualResetEvent 객체 필드
var signal = new ManualResetEvent(false);
for (int i = 0; i < 10; i++)
{
int temp = i;
new Thread(() =>
{
Console.WriteLine($"{temp} 신호 대기");
//신호 대기
signal.WaitOne();
Console.WriteLine($"{temp} 번째 신호 받음!!!");
}).Start();
}
//주 메인 스레드
Thread.Sleep(2000);
//신호 연다
signal.Set();
}
}
}
|
cs |
실행 결과
위와 같이, 총 10개의 스레드를 생성하였고 스레드에서의 작업 내용인 “몇 번째 신호 대기중” 문구가 10개의 스레드에서 모두 출력이 되고, 바로 신호 받음이 뜨는 것이 아니라, 메인 스레드에서 2초의 대기 시간을 가진 후 ManualResetEvent 객체를 Set 해주고 나서야 10개의 스레드가 일제히 작업을 하여 “몇 번째 신호 받음” 문구가 나란히 출력 되는 것을 확인하실 수 있습니다.
감사합니다.^^
728x90
'C# > C# 문법' 카테고리의 다른 글
[C# 문법] C# 상속 (0) | 2020.12.15 |
---|---|
[C# 문법] Null 가능 형식 (?) (0) | 2020.12.14 |
[C# 문법] Thread Join 메서드와 Sleep 메서드 사용방법 (0) | 2020.11.10 |
[C# 문법] C# JSON 파일 생성, 쓰기, 읽기 (11) | 2020.10.17 |
[C# 문법] C# 파일 생성, 쓰기, 삭제 방법 (0) | 2020.10.16 |
이 글을 공유하기