AutoResetEvent介绍及使用场景

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 }

猜你喜欢

转载自www.cnblogs.com/fanfan-90/p/12006822.html