AutoResetEvent/ManualResetEvent 都是继承自 EventWaitHandle ,EventWaitHandle继承自WaitHandle.

在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的。(这不是废话)

先来讨论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的一个重要区别:

  1.manual的话肯定会给线程1和线程2都发送一个信号,而auto只会随机给其中一个发送信号,也就是只有一方可以继续行动。

为什么一个叫manual而一个叫auto呢?我想这是很多人的疑问,现在我们就来看这个问题。

2.刚才_manualResetEvent .Set();的这句话我想大家都明白了,可以看做将IsRelease的属性设置为true.线程1中

 _manualResetEvent.WaitOne();接收到信号后不再阻塞线程1。在此之后的整个过程中IsRelease的值都是true.如果

想将IsRelease的值回复成false,就必须再调用_manualResetEvent.Reset()的方法。

  

最新文章

  1. pyqt信号和槽应用举例
  2. js中遍历出查询后的listmodel(下拉框系列)
  3. 大话设计模式C++版——简单工厂模式
  4. centos之Haproxy 负载均衡学习笔记
  5. 【初识 JQMobile 小小总结】
  6. Ubuntu查看系统的信息
  7. php中的编码问题
  8. C# Java 3DES加密解密 扩展及修正\0 问题
  9. 常用JVM配置参数
  10. Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)
  11. 《Java web 开发实战经典》读书笔记
  12. 搭建Minisipserve服务器实现局域网内IOS客户端idoubs的通信
  13. Erlang调度器细节探析
  14. 【规范】前端编码规范——css 规范
  15. Beyond Compare 4过期
  16. SQL server学习(四)T-SQL编程之事务、索引和视图
  17. Appium 输入 & 符号,实际输入&-
  18. Unity生成WebService代理类
  19. 【cs229-Lecture3】为什么要选择“最小二乘法”这个指标
  20. 组件之间的通讯:vuex状态管理,state,getters,mutations,actons的简单使用(一)

热门文章

  1. mysql数据库的理解
  2. this 的指向
  3. Mui中常见问题记录
  4. Spring Boot微服务如何集成fescar解决分布式事务问题?
  5. kettle中文乱码问题
  6. MySQL表数据的增删改查
  7. python--对象实例化过程
  8. java面试总结(资料来源网络)
  9. SpringCloud系列六:Feign接口转换调用服务(Feign 基本使用、Feign 相关配置)
  10. UICollectionView didSelectItemAtIndexPath实现方法