标签:
本文在于巩固基础
AutoResetEvent
概念:通知正在等待的线程已发生的事件
如果AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资源可用。 调用Set 向AutoResetEvent 发信号以释放等待线程。
可以通过构造函数设置事件状态 false为非终止,true为终止
常用方法:
Set();将事件状态设置为终止状态,允许一个或多个等待线程继续。
ReSet();将事件状态设置为非终止状态,导致线程阻止
WaitOne();阻止当前线程,直到当前 WaitHandle 收到信号。
ManualResetEvent用法差不多,有一点差别,在下面可以看到
下面通过一个简单实例来演示这个基本用法
class Program { //设置事件状态为非终止 private static ManualResetEvent _manualResetEvent=new ManualResetEvent(false); private static Thread _thread = new Thread(new ThreadStart(ThreadMethod)); private static int _count = 0; static void Main(string[] args) { _thread.Start(); Console.ReadLine(); _manualResetEvent.Set();// 通知等待线程继续 } private static void ThreadMethod() { while (true) { _manualResetEvent.WaitOne();//由于上面设置事件状态为非终止所以下面语句不会执行,除非收到可以继续的信号 Thread.Sleep(1000); Console.WriteLine(_count++); } }
一开始不会有输出,直到你输入数据后线程才会继续
结果如下
W
0
1
2
3
4
5
6
7
8
...
注意这里AntoResetEvent中的WaitOne方法会切换信号(不怎么专业,明白就好),也就是,这次是收到信号,下次就变成无信号,再执行又有信号,如此往复
下面是AntoResetEvent实现
class Program { //设置事件状态为非终止 private static AutoResetEvent _autoResetEvent=new AutoResetEvent(false); private static Thread _thread = new Thread(new ThreadStart(ThreadMethod)); private static int _count = 0; static void Main(string[] args) { _thread.Start(); Console.ReadLine(); _autoResetEvent.Set(); } private static void ThreadMethod() { while (true) { _autoResetEvent.WaitOne();//由于上面设置事件状态为非终止所以下面语句不会执行,除非收到可以继续的信号 Thread.Sleep(1000); Console.WriteLine(_count++); _autoResetEvent.Set();//上面的WaitOne执行后变为无信号,这样下次循环就阻塞了,这步可以使下次循环接收到继续的信号 } } }
AutoResetEvent和ManualResetEvent
标签:
原文地址:http://www.cnblogs.com/jixinyu/p/4308670.html