• 以1个实例讲解ManualResetEvent的作用


    来自森大科技官方博客
    http://www.cnsendblog.com/index.php/?p=349
    GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
    http://cnsendnet.taobao.com

    1. 源码下载:
    下载地址:http://files.cnblogs.com/tianzhiliang/ManualResetEventDemo.rar
    Demo:

    2. ManualResetEvent详解
    ManualResetEvent 允许线程通过发信号互相通信。通常,此通信涉及一个线程在其他线程进行之前必须完成的任务。当一个线程开始一个活动(此活动必须完成后,其他线程才能开始)时,它调用 Reset 以将 ManualResetEvent 置于非终止状态,此线程可被视为控制 ManualResetEvent。调用 ManualResetEvent 上的 WaitOne 的线程将阻止,并等待信号。当控制线程完成活动时,它调用 Set 以发出等待线程可以继续进行的信号。并释放所有等待线程。一旦它被终止,ManualResetEvent 将保持终止状态(即对 WaitOne 的调用的线程将立即返回,并不阻塞),直到它被手动重置。可以通过将布尔值传递给构造函数来控制 ManualResetEvent 的初始状态,如果初始状态处于终止状态,为 true;否则为 false。

    代码在同级目录中有,这里就不贴出来了。

    图1

    从下图中可以看出,实例化ManualResetEvent对象时,传的是true,则将初始状态设置为终止。程序首次运行,两个线程都在持续运行,如图3所示

    图2

    输入reset命令,执行Reset方法,将事件状态设置为非终止状态,导致线程阻止。所以两个线程方法都停止运行了

    输入set命令,执行Set方法,将事件状态设置为终止状态,允许一个或多个等待线程继续,所以2个线程又都开始运行了。

    结论:WaitOne方法在这里很关键,阻止当前线程,直到当前 System.Threading.WaitHandle 收到信号。ManualResetEvent对象可以作为一个全局变量,多个线程可以访问它,如果ManualResetEvent对象实例化传的是true时,或者ManualResetEvent对象被执行Set方法时,写了.WaitOne的线程方法将继续执行;如果ManualResetEvent对象被执行Reset方法时,写了.WaitOne的线程方法将停止执行,一直等待,知道被执行了Set方法为止。

    验证:如下图所示,注释了WaitOne方法,即使执行了Reset方法,由于没有WaitOne的控制,这两个线程一样的在运行。

    来自森大科技官方博客
    http://www.cnsendblog.com/index.php/?p=349
    GPS平台、网站建设、软件开发、系统运维,找森大网络科技!
    http://cnsendnet.taobao.com

  • 相关阅读:
    time 时间模块的函数调用
    str 文本函数的调用
    批量分发公钥
    K8s集群部署(四)------ Flannel网络部署
    kuberbetes基础概念
    K8s集群部署(三)------ Node节点部署
    K8s集群部署(二)------ Master节点部署
    K8s集群部署(一)------ETCD集群部署
    日常更新脚本
    CentOS7系统安装
  • 原文地址:https://www.cnblogs.com/cnsend/p/12256109.html
Copyright © 2020-2023  润新知