原创 ManualResetEvent和AutoResetEvent的区别

2010-9-20 16:13 1629 4 5 分类: 软件与OS
在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的。(这不是废话)

 


      先来讨论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.

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户377235 2012-6-7 10:33

写的不错,逻辑很清晰

相关推荐阅读
用户231327 2010-09-20 15:41
VB.NET数据库工具教程之一
前言  如果有人问我,在编程方面自80年代以来最大的变化是什么,我的回答肯定是编程人员使用的开发工具。随着编程的发展,我们完成的实际工作并不比15年前更多。我们的主要工作仍然是开发界面、更新数据、制作...
用户231327 2010-09-20 15:37
VB.NET多线程技术及其实现
1. 引言  1.1 进程与线程和应用程序域  在操作系统中,进程被定义为应用程序的运行实例,是应用程序的一次动态执行。线程是进程内部程序执行的路径,是进程的一个执行单元。从根本上说,线程是可由系统调...
用户231327 2010-09-20 15:17
VB.NET环境下的Socket编程举例
 一直以来很想学习Socket编程方面的应用,比如怎样通过Socket编程实现单片机与PC的TCP连接通信。在单片机嵌入网卡芯片与PC进行连接通信,实现PC的web方式对单片机所控制的设备的状态管理,...
用户231327 2010-09-20 14:43
VB.NET中使用委托对方法异步调用
1、为什么要使用异步调用(Asynchronous Method Execution) 按照我们常规的思维方式,计算机应该是干完一件事,然后再干下一件。用术语来说,这种执行任务的方式叫做同步执行(Sy...
用户231327 2010-09-20 14:13
在51系列单片机上移植uCOS-II
内容摘要:本文详细系统地介绍了uC/OS-II在51单片机上的移植、重入实现方法、硬件仿真、固化、人机界面等关键内容。引言:随着各种应用电子系统的复杂化和系统实时性需求的提高,并伴随应用软件朝着系统化...
EE直播间
更多
我要评论
1
4
关闭 站长推荐上一条 /3 下一条