• AutoResetEvent和ManualResetEvent理解


    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)后,闸机关闭(有信号),乘客进入。然后闸机再开启(没信号),

    高亮就是它们的区别了。可以想象一般情况下闸机是一个AutoResetEvent,每当通过一个客人后,闸机又开启,闸机遇到了故障第一个人刷卡进入后,闸机还是处于关闭,这样之后的乘客不用WaitOne可以继续进入

    也就是

    autoResetEventResetEventWaitHandle.Set()

    等同于

    manualResetEventWaitHandle.Set()

    manualResetEventWaitHandle.Reset();

     

    补充 ManualResetEventSlim

    Framework4中的ManualResetEvent轻量级优化版,推荐使用

     

    参考:

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

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

  • 相关阅读:
    Python:完全数
    Python:将 list 写入一个 txt 文件
    Python:对称数组
    Python:列表反转、切片
    Python:print输出间隔,换行
    Python:打印99乘法表
    Python:排序(sort / 冒泡排序)
    安装pipenv
    flex布局
    python正则表达式
  • 原文地址:https://www.cnblogs.com/miku/p/4295533.html
Copyright © 2020-2023  润新知