zoukankan      html  css  js  c++  java
  • 多线程中 ManualResetEvent 的用法

            /// <summary>
            /// 手动重启
            /// </summary>
            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

  • 相关阅读:
    Vue入门
    吃透SprinngBoot
    SSM整合详解
    Linux查找端口并关闭
    接入腾讯云的OCR识别身份证信息
    IDEA 快捷键《宋红康版》
    Mysql详解
    docker常见命令
    SpringBoot集成Redis
    使用mybatis出现异常
  • 原文地址:https://www.cnblogs.com/wgx0428/p/12153158.html
Copyright © 2011-2022 走看看