线程的暂停与继续(ManulResetEvent 与 AutoResetEvent)

ManualResetEvent 与 AutoResetEvent 区别

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


 ManualResetEvent mSet = new ManualResetEvent(false);
AutoResetEvent aSet = new AutoResetEvent(false);

 

共同点:

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

Reset () // 红灯

Set () // 绿灯

WaitOne () // 等待信号

 

不同点:

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

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

 

msdn 提到 (如果没有线程 处于 WaitOne () 状态,而调用 Set , AutoResetEvent 将保持 Set 状态):

调用 Set 信号 AutoResetEvent 释放等待线程。 AutoResetEvent 将保持终止状态直到一个等待线程释放,并自动返回到非信号状态。 如果没有线程处于等待状态,状态将无限期地保持已发出信号。

因此通常 WatiOne 之前,先 Reset () 一下,清除 Set 信号

 

需要注意的是(两个 Set 调用之间时间较短,第二个 Set 信号可能会丢失,因此连续 Set 调用,中间需要 Sleep 一定时间):

不能保证的每个调用 Set 方法将释放一个线程。 如果两次调用太靠近在一起,以便第二次调用前释放线程发生,只有一个线程被释放。 就像第二次调用未发生。 此外,如果 Set 时没有等待的线程调用和 AutoResetEvent 已终止,则调用不起作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值