以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
在这里插入图片描述
图3
输入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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值