AutoResetEvent 允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。
线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
通过调用 Set 发出资源可用的信号。
调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。
可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true;否则为 false。
通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,
等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。下面我们来举一个例子:我去书店买书,当我选中一本书后我会去收费处付钱,
付好钱后再去仓库取书。这个顺序不能颠倒,我作为主线程,收费处和仓库做两个辅助线程,代码如下:
1 using System; 2 using System.Linq; 3 using System.Activities; 4 using System.Activities.Statements; 5 using System.Threading; 6 7 namespace CaryAREDemo 8 { 9 class Me 10 { 11 const int numIterations = 550; 12 static AutoResetEvent myResetEvent = new AutoResetEvent(false); 13 static AutoResetEvent ChangeEvent = new AutoResetEvent(false); 14 //static ManualResetEvent myResetEvent = new ManualResetEvent(false); 15 //static ManualResetEvent ChangeEvent = new ManualResetEvent(false); 16 static int number; //这是关键资源 17 18 static void Main() 19 { 20 Thread payMoneyThread = new Thread(new ThreadStart(PayMoneyProc)); 21 payMoneyThread.Name = "付钱线程"; 22 Thread getBookThread = new Thread(new ThreadStart(GetBookProc)); 23 getBookThread.Name = "取书线程"; 24 payMoneyThread.Start(); 25 getBookThread.Start(); 26 27 for (int i = 1; i <= numIterations; i++) 28 { 29 Console.WriteLine("买书线程:数量{0}", i); 30 number = i; 31 //Signal that a value has been written. 32 myResetEvent.Set(); 33 ChangeEvent.Set(); 34 Thread.Sleep(0); 35 } 36 payMoneyThread.Abort(); 37 getBookThread.Abort(); 38 } 39 40 static void PayMoneyProc() 41 { 42 while (true) 43 { 44 myResetEvent.WaitOne(); 45 //myResetEvent.Reset(); 46 Console.WriteLine("{0}:数量{1}", Thread.CurrentThread.Name, number); 47 } 48 } 49 static void GetBookProc() 50 { 51 while (true) 52 { 53 ChangeEvent.WaitOne(); 54 // ChangeEvent.Reset(); 55 Console.WriteLine("{0}:数量{1}", Thread.CurrentThread.Name, number); 56 Console.WriteLine("------------------------------------------"); 57 Thread.Sleep(0); 58 } 59 } 60 } 61 }