首页 > 代码库 > ManualResetEvent的使用

ManualResetEvent的使用

  1 using System;  2 using System.Threading;  3   4 public class Example  5 {  6     // mre is used to block and release threads manually. It is  7     // created in the unsignaled state.  8     private static ManualResetEvent mre = new ManualResetEvent(false);  9  10     static void Main() 11     { 12         Console.WriteLine("\nStart 3 named threads that block on a ManualResetEvent:\n"); 13  14         for(int i = 0; i <= 2; i++) 15         { 16             Thread t = new Thread(ThreadProc); 17             t.Name = "Thread_" + i; 18             t.Start(); 19         } 20  21         Thread.Sleep(500); 22         Console.WriteLine("\nWhen all three threads have started, press Enter to call Set()" + 23                           "\nto release all the threads.\n"); 24         Console.ReadLine(); 25  26         mre.Set(); 27  28         Thread.Sleep(500); 29         Console.WriteLine("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()" + 30                           "\ndo not block. Press Enter to show this.\n"); 31         Console.ReadLine(); 32  33         for(int i = 3; i <= 4; i++) 34         { 35             Thread t = new Thread(ThreadProc); 36             t.Name = "Thread_" + i; 37             t.Start(); 38         } 39  40         Thread.Sleep(500); 41         Console.WriteLine("\nPress Enter to call Reset(), so that threads once again block" + 42                           "\nwhen they call WaitOne().\n"); 43         Console.ReadLine(); 44  45         mre.Reset(); 46  47         // Start a thread that waits on the ManualResetEvent. 48         Thread t5 = new Thread(ThreadProc); 49         t5.Name = "Thread_5"; 50         t5.Start(); 51  52         Thread.Sleep(500); 53         Console.WriteLine("\nPress Enter to call Set() and conclude the demo."); 54         Console.ReadLine(); 55  56         mre.Set(); 57  58         // If you run this example in Visual Studio, uncomment the following line: 59         //Console.ReadLine(); 60     } 61  62  63     private static void ThreadProc() 64     { 65         string name = Thread.CurrentThread.Name; 66  67         Console.WriteLine(name + " starts and calls mre.WaitOne()"); 68  69         mre.WaitOne(); 70  71         Console.WriteLine(name + " ends."); 72     } 73 } 74  75 /* This example produces output similar to the following: 76  77 Start 3 named threads that block on a ManualResetEvent: 78  79 Thread_0 starts and calls mre.WaitOne() 80 Thread_1 starts and calls mre.WaitOne() 81 Thread_2 starts and calls mre.WaitOne() 82  83 When all three threads have started, press Enter to call Set() 84 to release all the threads. 85  86  87 Thread_2 ends. 88 Thread_0 ends. 89 Thread_1 ends. 90  91 When a ManualResetEvent is signaled, threads that call WaitOne() 92 do not block. Press Enter to show this. 93  94  95 Thread_3 starts and calls mre.WaitOne() 96 Thread_3 ends. 97 Thread_4 starts and calls mre.WaitOne() 98 Thread_4 ends. 99 100 Press Enter to call Reset(), so that threads once again block101 when they call WaitOne().102 103 104 Thread_5 starts and calls mre.WaitOne()105 106 Press Enter to call Set() and conclude the demo.107 108 Thread_5 ends.109  */


原文来自:http://msdn.microsoft.com/zh-cn/library/system.threading.manualresetevent(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-1