前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程中 ManualResetEvent 的用法[通俗易懂]

多线程中 ManualResetEvent 的用法[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-07 11:45:03
6880
发布2022-09-07 11:45:03
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

代码语言:javascript
复制
        /// <summary>
        /// 手动重启
        /// </summary>
        private ManualResetEvent manualReset = new ManualResetEvent(false);
代码语言:javascript
复制
                if (suspend)
                {
                    manualReset.WaitOne();//暂停发送
                }
代码语言:javascript
复制
            SuspendCommand = new RelayCommand(o => { suspend = true; manualReset.Reset(); });
            RestoreCommand = new RelayCommand(o=> { suspend = false; manualReset.Set(); });

它可以通知一个或多个正在等待的线程已发生事件,允许线程通过发信号互相通信,来控制线程是否可心访问资源

##

代码语言:javascript
复制
ManualResetEvent manualReset = new ManualResetEvent(false);
构造函数参数为 False:代表无信号,True:代表有信号
当无信号时,manualReset.WaitOne();   代表没人通知它,所以它默认就是阻塞状态。调用Set()方法后代表有人通知它来信号了,它将停止阻塞。
当有信号时,manualReset.WaitOne();   代表有人通知它,它将无阻塞。 调用Reset()方法代表有人通知它现在信号没了,它将继续开始阻塞。

在多线程开发中,时常用到 ManualResetEvent 与 AutoResetEvent 。 它们如同道路交通中的信号灯。两者之间有什么区别呢?

共同点:

均继承 EventWaitHandle 接口,因此,均具有以下功能:

Reset() //红灯

Set() //绿灯

WaitOne() // 等待信号

不同点:

AutoResetEvent 收到 Set 后 , 一次只能执行一个线程,其它线程继续 WaitOne 。

ManualResetEvent 收到 Set 后,所有处理 WaitOne 状态线程均继续执行。

参考文章:https://www.cnblogs.com/howtrace/p/11362284.html https://www.cnblogs.com/li-peng/p/3291306.html

运行图说明

多线程中 ManualResetEvent 的用法[通俗易懂]
多线程中 ManualResetEvent 的用法[通俗易懂]

图片来源:https://www.cnblogs.com/lihuali/p/11672088.html

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154809.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档