• 【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 阻止线程,直到所有指示的事件都变为终止状态。

  • 相关阅读:
    图论100题 1~5题
    定价 题解
    题解 编码问题【NOIP1995普及+提高】
    【题解】2020牛客NOIP赛前集训营-普及组(第二场)
    数论学习笔记
    el-tree 点击选中的数据集合
    nginx 本地配置(解决跨域问题)
    原生对象写法,dom调用方法
    手写无缝轮播banner
    element Notification 通知文字换行小技巧
  • 原文地址:https://www.cnblogs.com/mqxs/p/4630846.html
Copyright © 2020-2023  润新知