博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【深度好文】多线程之WaitHandle-->派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent...
阅读量:5016 次
发布时间:2019-06-12

本文共 1492 字,大约阅读时间需要 4 分钟。

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()的方法。

  

 

转载于:https://www.cnblogs.com/x-poior/p/6305652.html

你可能感兴趣的文章
php_soap扩展应用
查看>>
js学习总结----DOM增删改和应用
查看>>
希尔伯特矩阵(Hilbert matrix)
查看>>
(20)sopel算法
查看>>
学习总结 javascript 闭包
查看>>
实验吧一个小坑注入
查看>>
【 D3.js 高级系列 — 8.0 】 打标
查看>>
Mac必备软件推荐
查看>>
Android Gson深入分析
查看>>
display:flow-root
查看>>
判读字符串是否为空的全局宏-分享
查看>>
22-reverseString-Leetcode
查看>>
Centos 开机自动联网
查看>>
cocos2dx使用lua和protobuf
查看>>
HDOJ 5630 Rikka with Chess
查看>>
netcore2.1 在后台运行一个任务
查看>>
DOCKER 从入门到放弃(五)
查看>>
Python 多线程学习
查看>>
获取NVIDIA显卡的温度
查看>>
Dijkstra算法
查看>>