2014. 12. 24. 11:42
C#
하나 이상의 대기 중인 스레드에 이벤트가 발생했음을 알립니다. 이 클래스는 상속될 수 없습니다.
ManualResetEvent 를 사용하여 스레드는 신호를 보냄으로써 서로 통신할 수 있습니다. 일반적으로 이 통신은 다른 스레드가 처리되기 위해 먼저 하나의 스레드가 완료해야 하는 작업과 관련이 있습니다.
하나의 스레드에서 다른 스레드의 처리를 위해 먼저 완료되어야 하는 작업을 시작할 때 Reset을 호출하여 ManualResetEvent를 신호 없음 상태로 설정합니다. 이 스레드는 ManualResetEvent를 제어하는 것으로 간주될 수 있습니다. ManualResetEvent 에 대해 WaitOne을 호출하는 스레드는 차단되며 신호를 기다립니다. 제어 스레드는 해당 작업을 끝나면 Set을 호출하여 대기 중인 스레드가 계속될 수 있음을 알립니다. 대기 중인 모든 스레드는 해제됩니다.
출처 : http://msdn.microsoft.com/ko-kr/library/system.threading.manualresetevent(v=vs.110).aspx
실행 화면
예제 프로그램
// mre is used to block and relrease threads manually. It is // created in unsignaled state. private static ManualResetEvent mre = new ManualResetEvent(false); static void Main(string[] args) { Console.WriteLine("\nStart 3 named threads that block on a ManualResetEvent\n"); for (int i = 0; i <= 2; i++) { Thread t = new Thread(ThreadProc); t.Name = "Thread_" + i.ToString(); t.Start(); } #region 테스트1 - Set() Thread.Sleep(500); Console.WriteLine("\nWhen all three threads have started, press Enter to call Set()\n" + "\nto release all the threads.\n"); Console.ReadLine(); mre.Set(); #endregion #region 테스트2 - Reset() Thread.Sleep(500); Console.WriteLine("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()" + "\ndo not block. Press Enter to show this.\n"); Console.ReadLine(); for (int i = 3; i <= 4; i++) { Thread t = new Thread(ThreadProc); t.Name = "Thread_" + i.ToString(); t.Start(); } Thread.Sleep(500); Console.WriteLine("\nPress Enter to call Reset(), so that threads once again block\n" + "\nwhen they call WaitOne\n"); Console.ReadLine(); mre.Reset(); #endregion #region 테스트3 - Set() //Start a thread that waits on the ManualResetEvent Thread t5 = new Thread(ThreadProc); t5.Name = "Thread_5"; t5.Start(); Thread.Sleep(500); Console.WriteLine("\nPress Enter to call Set() and conclude the demo\n"); Console.ReadLine(); mre.Set(); #endregion Console.ReadLine(); } private static void ThreadProc() { string name = Thread.CurrentThread.Name; Console.WriteLine(name + " starts and call mre.WaitOne()"); mre.WaitOne(); Console.WriteLine(name + " ends"); }
'C#' 카테고리의 다른 글
텍스트 로그 파일 라이브러리 - 2 (0) | 2015.02.21 |
---|---|
멀티플(multiple) 윈도우 - 1 (0) | 2015.01.24 |
멀티스레드 환경에서 UI 에 데이타 표시할 경우 (0) | 2015.01.15 |
Task 클래스 (0) | 2015.01.10 |
텍스트 로그 파일 라이브러리 - 1 (0) | 2015.01.09 |