AutoResetEvent和ManualResetEvent理解 z

AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandle,API相同,但在使用中还是有区别的。

每次使用时虽然理解了,但由于没有去深入思考记忆,过几天又忘记了。到下次需要使用的时候又要重新去理解这2个类。

今天再次遇到他们,写下这篇随笔。。加深理解印象。以后不用去纠结他们了。

1.构造函数参数

var manualResetEventWaitHandle = new ManualResetEvent(true);

var autoResetEventResetEventWaitHandle = new AutoResetEvent(true);

MSDN的解释:True有信号,False无信号

为True,代码执行过程中遇到WaitHandle.WaitOne()的时候,(有了信号)不会阻塞该线程,将会继续执行下去。

如为False,遇到WaitHandle.WaitOne()的时,当前线程被挂起(没有信号,等待信号),直到另一个线程执行WaitHandle.Set(),线程才会继续执行WaitHandle.WaitOne后面的代码

2.Set和Reset方法

MSDN的解释:Set为终止状态(有信号),Reset设置为非终止状态(没有信号)

结合构造函数的参数这样比较好理解了。

var waitHandle = new ManualResetEvent/AutoResetEvent(false)

waitHandle.Set()

等价于

var waitHandle = new ManualResetEvent/AutoResetEvent(true)

同理

var waitHandle = new ManualResetEvent/AutoResetEvent(true)

waitHandle.Reset()

等价于

var waitHandle = new ManualResetEvent/AutoResetEvent(false)

3.AutoResetEvent和ManualResetEvent

轮到主角了。以地铁闸机为比喻,闸机开启(没有信号)  乘客来到闸机前无法通行(WaitOne),刷卡(Set)后,闸机关闭(有信号),乘客进入。Framework4中的ManualResetEvent轻量级优化版,推荐使用

参考:

http://www.cnblogs.com/qingyun163/archive/2013/01/05/2846633.html

http://baike.baidu.com/link?url=Cu-Oakr8hkaYtpg9hPTMuuUtAiMdSBc-f_LCs3-dtWTcYSIvbl9b22AKi63MyZ3I9RtmYtUCnYtVFsjTrQiNVq

时间: 2024-10-08 09:46:26

AutoResetEvent和ManualResetEvent理解 z的相关文章

AutoResetEvent和ManualResetEvent理解

AutoResetEvent和ManualResetEvent用于多线程之间代码执行顺序的控制,它们继承自WaitHandleAPI类似,使用中还是有区别的. 之前每次需要使用的时候,都去找他们之间的区别.虽然当时是明白了,但没有深入理解透彻,过几天又忘记了.等到下次需要使用的时候又要重新去理解这2个类. 今天再次遇到他们,写下这篇随笔..加深理解印象.到了下次再用到不用再去纠结区别了. 1.构造函数参数 var manualResetEventWaitHandle = new ManualRe

C#深入理解AutoResetEvent和ManualResetEvent

当在C#使用多线程时就免不了使用AutoResetEvent和ManualResetEvent类,可以理解这两个类可以通过设置信号来让线程停下来或让线程重新启动,其实与操作系统里的信号量很相似(汗,考完考试已经有点忘记了).下面上代码 class Program { const int count = 10; //赋值为false也就是没有信号 static AutoResetEvent myResetEvent = new AutoResetEvent(false); static int n

个人对AutoResetEvent和ManualResetEvent的理解

一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方法的官方定义并不好理解,什么终止.非终止,乱七八糟的.在这里,我们以一种通俗易懂的概念来说明. 二.比喻 如果把每个线程比作一辆汽车的话,AutoResetEvent和ManualResetEvent就是公路上的收费站. 其中: Reset 关闭收费站车闸禁止通行(拦截车辆才好收费啊): WaitOne 收费员等待下一辆车辆过来(然后

个人对AutoResetEvent和ManualResetEvent的理解(转载)

仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方法的官方定义并不好理解,什么终止.非终止,乱七八糟的.在这里,我们以一种通俗易懂的概念来说明. 二.比喻 如果把每个线程比作一辆汽车的话,AutoResetEvent和ManualResetEvent就是公路上的收费站. 其中: Reset 关闭收费站车闸禁止通行(拦截车辆才好收费啊): WaitO

[转]个人对AutoResetEvent和ManualResetEvent的理解

仅个人见解,不对之处请指正,谢谢. 一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方法的官方定义并不好理解,什么终止.非终止,乱七八糟的.在这里,我们以一种通俗易懂的概念来说明. 二.比喻 如果把每个线程比作一辆汽车的话,AutoResetEvent和ManualResetEvent就是公路上的收费站. 其中: Reset 关闭收费站车闸禁止通行(拦截车辆才好收费啊): WaitO

C#AutoResetEvent和ManualResetEvent的区别

一:终止状态和非终止状态 首先说说线程的终止状态和非终止状态.AutoResetEvent和ManualResetEvent的构造函数中,都有bool变量来指明线程的终止状态和非终止状态.true表示终止状态(个人理解也就是可运行状态,根据理解应该是该线程的阻塞终止了),false表示非终止状态. AutoResetEvent _autoResetEvent = new AutoResetEvent(false); private void BT_Temp_Click(object sender

服务总结 -多线程 - 线程同步(AutoResetEvent与ManualResetEvent)

前言 在我们编写多线程程序时,会遇到这样一个问题:在一个线程处理的过程中,需要等待另一个线程处理的结果才能继续往下执行.比如:有两个线程,一个用来接收Socket数据,另一个用来处理Socket数据,而处理Socket数据的那个线程需要在接收到Socket数据后才能处理运行,就要等待接收线程接收数据.那么处理线程如何等待,接收线程又如何通知处理线程呢? 其中一个比较好的方式就是使用AutoResetEvent/ManualResetEvent 1. AutoResetEvent/ManualRe

C#多线程同步事件及等待句柄AutoResetEvent 和 ManualResetEvent

最近捣鼓了一下多线程的同步问题,发现其实C#关于多线程同步事件处理还是很灵活,这里主要写一下,自己测试的一些代码,涉及到了AutoResetEvent 和 ManualResetEvent,当然还有也简要提了一下System.Threading.WaitHandle.WaitOne .System.Threading.WaitHandle.WaitAny和System.Threading.WaitHandle.WaitAll ,下面我们一最初学者的角度来看,多线程之间的同步. 假设有这样的一个场

AutoResetEvent和ManualResetEvent对比

一.作用 AutoResetEvent和ManualResetEvent可用于控制线程暂停或继续,拥有重要的三个方法:WaitOne.Set和Reset. 这三个方法的官方定义并不好理解,什么终止.非终止,乱七八糟的.在这里,我们以一种通俗易懂的概念来说明. 二.比喻 如果把每个线程比作一辆汽车的话,AutoResetEvent和ManualResetEvent就是公路上的收费站. 其中: Reset 关闭收费站车闸禁止通行(拦截车辆才好收费啊): WaitOne 收费员等待下一辆车辆过来(然后