线程同步之ManualResetEvent 和AutoResetEvent

      ManualResetEvent :手动重置事件,通常用于一个线程在其他线程进行之前必须完成的任务。

      ManualResetEvent 允许线程通过发信号互相通信。 通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。

当一个线程(比如线程A)开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态。 此线程可被视为控制 ManualResetEvent。 调用 ManualResetEvent 上的 WaitOne 的线程将阻止(也就是其他线程将被阻止,比如线程B这时候调用WaitOne的线程将被阻止在该方法,也就是该方法不会立即返回),并等待信号。 当控制线程(线程A)完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。 并释放所有等待线程。

      可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false

一旦它被终止,ManualResetEvent 将保持终止状态,直到它被手动重置。 即对 WaitOne 的调用将立即返回。()

   

1 static ManualResetEvent _manualEvent = new ManualResetEvent(false);//创建,将其设置为非终止状态,这样调用_manualEvent.Wait 的线程将被阻塞。
2
3 //这个函数所在的线程结束后,才开始其他线程
4
5 public static void SetValue()
6 {
7
8 //这里不需要这样调用_manualEvent.Wait,因为其是前置的
9 Thread.Sleep(5000);//故意让此线程延迟一会儿
10 Console.WriteLine("正在更新数据");
11 value = 100;
12 Console.WriteLine("更新完毕value:{0}",value);
13 _manualEvent.Set();//通知其他进程可以读取数据,在这里设置之后,接下来等待的多个线程可以并发执行,而通过AutoResetEvent 设置的,在一个线程访问后又会自动Reset,后续的线程又会被阻塞。
14 }
15
16 //等待某个线程完成后才能访问某个资源的线程所在的函数
17
18 public static void ReadValue()
19 {
20 Console.WriteLine("准备访问");
21 if (_manualEvent.WaitOne() == true) //如果_manualEvent是非终止状态则这个函数所在的线程会被阻塞
22 {
23 Console.WriteLine("开始访问");
24 Console.WriteLine(value);
25 }
26 }

 

      AutoResetEvent:自动重置事件允许线程通过发信号互相通信。通常,此通信涉及线程需要独占访问的资源。线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程通过调用 Set 发出资源可用的信号。

      调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

      可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为 true;否则为 false。

      AutoResetEvent 作用?EventHandler?WaitHander?

  

posted @ 2010-12-31 17:32  雁北飞  阅读(262)  评论(0编辑  收藏  举报