ManualResetEvent和AutoResetEvent的区别
来源:互联网 发布:手机淘宝怎么登录注册 编辑:程序博客网 时间:2024/05/02 00:45
在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的。(这不是废话)
先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容,来做对比:
ManualResetEvent都可以阻塞一个或多个线程,直到收到一个信号告诉ManualResetEvent不要再阻塞当前的线程。
可以想象ManualResetEvent这个对象内部有一个Boolean类型的属性IsRelease来控制是否要阻塞当前线程。这个属性我们在初始化的时候可以设置它,如ManualResetEvent event=new ManualResetEvent(false);这就表明默认的属性是要阻塞当前线程。
代码举例:
ManualResetEvent _manualResetEvent = new ManualResetEvent(false); private void BT_Temp_Click(object sender, RoutedEventArgs e) { Thread t1 = new Thread(this.Thread1Foo); t1.Start(); //启动线程1 Thread t2 = new Thread(this.Thread2Foo); t2.Start(); //启动线程2 Thread.Sleep(3000); //睡眠当前主线程,即调用BT_Temp_Click的线程 _manualResetEvent .Set(); //想象成将IsRelease设为True } void Thread1Foo() { _manualResetEvent .WaitOne(); //阻塞线程1,直到主线程发信号给线程1,告知_menuResetEvent你的IsRelease属性已经为true,//这时不再阻塞线程1,程序继续往下跑 MessageBox.Show("t1 end"); } void Thread2Foo() { _manualResetEvent .WaitOne();//阻塞线程2,直到主线程发信号给线程1,告知_menuResetEvent你的IsRelease属性已经为true,//这时不再阻塞线程2,程序继续往下跑 MessageBox.Show("t2 end"); }
注意这里ManualResetEvent和AutoResetEvent的一个重要区别:
manual的话肯定会给线程1和线程2都发送一个信号,而auto只会随机给其中一个发送信号。
为什么一个叫manual而一个叫auto呢?我想这是很多人的疑问,现在我们就来看这个问题。
刚才_manualResetEvent .Set();的这句话我想大家都明白了,可以看做将IsRelease的属性设置为true.线程1中
_manualResetEvent.WaitOne();接收到信号后不再阻塞线程1。在此之后的整个过程中IsRelease的值都是true.如果
想将IsRelease的值回复成false,就必须再调用_manualResetEvent.Reset()的方法。
如果是_autoResetEvent.set(),那么_autoResetEvent.WaitOne()后会自动将IsRelease的值自动设置为false.
这就是为什么一个叫auto,一个叫manual.
- ManualResetEvent和AutoResetEvent的区别
- ManualResetEvent和AutoResetEvent的区别
- ManualResetEvent和AutoResetEvent的区别
- ManualResetEvent和AutoResetEvent的区别
- ManualResetEvent和AutoResetEvent的区别
- AutoResetEvent和ManualResetEvent区别
- ManualResetEvent和AutoResetEvent 区别
- C#AutoResetEvent和ManualResetEvent的区别
- C#AutoResetEvent和ManualResetEvent的区别
- C#AutoResetEvent和ManualResetEvent的区别
- C#AutoResetEvent和ManualResetEvent的区别
- AutoResetEvent和ManualResetEvent区别[C#]
- AutoResetEvent与ManualResetEvent的区别
- AutoResetEvent与ManualResetEvent的区别
- ManualResetEvent和AutoResetEvent的关系
- AutoResetEvent和ManualResetEvent的理解
- AutoResetEvent 与 ManualResetEvent区别
- AutoResetEvent与ManualResetEvent区别
- mybatis(下篇)
- bash
- 深入浅出设计模式-读书心得1
- maven+spring+mybatis整合
- RabbitMQ环境变量设置
- ManualResetEvent和AutoResetEvent的区别
- 集合框架Collection概述
- mysql-readme
- android 笔记——listView应用技巧摘选
- 防止软件启动时候短暂的白屏或黑屏
- Quorum的NRW策略
- 【Cocos2d-x】新手自学(七)百分比读取进度加载图片资源到缓存(2.0.1版本)
- UVA 10051 Tower of Cubes 方块之塔 类LIS DP
- 常量const