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

多线程中 ManualResetEvent 的用法[通俗易懂]手动重启 private ManualResetE manualReset new ManualResetE false if suspend manualReset WaitOne 暂停发送 SuspendComma new RelayCommand o suspend

        /// 
/// 手动重启
///

private ManualResetEvent manualReset = new ManualResetEvent(false);
                if (suspend)
{
manualReset.WaitOne();//暂停发送
}
            SuspendCommand = new RelayCommand(o => { suspend = true; manualReset.Reset(); });
RestoreCommand = new RelayCommand(o=> { suspend = false; manualReset.Set(); });

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

##

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

运行图说明:

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

编程小号
上一篇 2025-02-21 16:21
下一篇 2025-01-28 23:46

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/140825.html