zoukankan      html  css  js  c++  java
  • 【C#】【Thread】ManualResetEvent和AutoResetEvent区别

    ManualResetEvent和AutoResetEvent主要用于线程之间同步问题。

    主要使用方法有Set();Reset();WaitOne();

    Set():将事件状态设置为终止状态,允许一个或多个等待线程继续。也就是说是结束状态,这个时候可以运行。

    Reset():将事件状态设置为非终止状态,导致线程阻止。也就是说是在运行状态,这个时候WaitOne()位置会等待,阻塞。

    WaitOne():阻止当前线程,直到当前 System.Threading.WaitHandle 收到信号。就是当前线程会等在WaitOne这个位置直到某个位置调用了Set()。

    ManualResetEvent manualEvent = new ManualResetEvent(false);

    AutoResetEvent autoEvent = new AutoResetEvent(false);

    两个构造函数都有一个bool值参数:

    true表示终止状态,即类似内部帮你调用了Set();

    false表示非终止状态,即类似内部帮你调用了Reset();

    可以这么记忆:

      Set设置,开启,那么就是可以开始运行了;reset重置,恢复初始值,初始值当然是不可以运行,那就是阻塞,构造函数 true是可以运行,false不允许运行(阻塞)

    以上为共同点,接下去说一下不同点。

    经过网上查阅资料,以及自己测试的结果,本人认为主要区别在于WaitOne();方法上。

    manualEvent.WaitOne();不会做处理,只是阻塞线程作用。

    autoEvent.WaitOne();会重新把autoEvent设置为非终止状态,也就是说内部可能会调用Reset();

    所以呢区别就是:

    manualEvent.Set();解放线程之后,所有的WaitOne都不会再阻塞。需要手动Reset();才能再次阻塞。

    autoEvent.Set();解放线程之后,第一个WaitOne执行下去,第二个WaitOne开始又会阻塞,需要再次Set();解放阻塞。

    换言之:ManualResetEvent 需要手动Reset进行阻塞线程,AutoResetEvent 每次WaitOne后自动Reset阻塞线程,无需人为操作。

     PS.WaitHandle的使用

    System.Threading.WaitHandle.WaitOne 使线程一直等待,直到单个事件变为终止状态;

    System.Threading.WaitHandle.WaitAny 阻止线程,直到一个或多个指示的事件变为终止状态;

    System.Threading.WaitHandle.WaitAll 阻止线程,直到所有指示的事件都变为终止状态。

  • 相关阅读:
    JSONP的学习(收集整理)
    10个必备的移动UI设计资源站(转)
    iscroll4框架解析[webapp开发](转)
    IE9中Media queries在iframe无效的解决方法
    mustache模板技术
    企业级的响应式设计(Responsive design at enterprise level)译
    在JSP中使用jQuery的冲突解决(收集整理)
    Java开发 Eclipse使用技巧(转)
    Front End中Javascript兼容问题收集(转)
    vector it->和*it
  • 原文地址:https://www.cnblogs.com/mqxs/p/4630846.html
Copyright © 2011-2022 走看看