一、两者区别

1.ManualResetEvent 调用一次Set()后将允许恢复所有被阻塞线程。需手动在调用WaitOne()之后调用Reset()重置信号量状态为非终止,然后再次调用WaitOne()的时候才能继续阻塞线程,反之则不阻塞

2.AutoResetEvent,调用一次Set()只能继续被阻塞的一个线程,多次调用Set()才行,但不需手动调用Reset();再次调用WaitOne()的时候又能阻塞线程,也是和前者的区别

3.两者单个实例均可阻塞一个或多个线程,在多个线程中调用 主线程 创建的 两者单个实例.WaitOne(),前提是两者实例必须是非终止状态

4.两者实例化构造参数解释

public AutoResetEvent(bool initialState);

true:设置终止状态。相当于调用了Set(),即首次不会被WaitOne()阻塞,下次执行WaitOne()才会被阻塞

false:设置非终止状态。遇到WaitOne()立即阻塞所在的一个或多个线程

5. 两者都只会阻塞WaitOne()所在的线程,WaitOne()可被多个线程调用

二、在哪里创建信号量实例?

一般情况下在工作线程中创建信号量的实例,在其他线程中使用,然后再在工作线程中调用Set(),可以是在非主线程创建实例

三、代码示例

   public  class Program
    {//1.AutoResetEvent,调用一次Set()只能继续一个阻塞线程//2.AutoResetEvent调用Set()后自动Reset()static void Main(string[] args){Thread t = null;AutoResetEvent Event = new AutoResetEvent(false);for (int i = 0; i < 2; i++){t = new Thread(() =>{while (true){//阻塞当前线程Event.WaitOne();Console.WriteLine("我是线程:" + Thread.CurrentThread.Name);Thread.Sleep(1000);}});t.Name = i + "";t.Start();}//5秒后允许一个等待的线程继续。当前允许的是线程1Thread.Sleep(5000);Event.Set();//5秒后允许一个等待的线程继续。当前允许的是线程2Thread.Sleep(5000);Event.Set();//PS:如果使用AutoResetEvent的WaitOne()将5个线程阻塞,则需要调用5次Set()才能恢复5;如果再次阻塞时,不需要手动调用Reset();Console.ReadLine();}//1.ManualResetEvent,调用一次Set()允许继续全部阻塞线程,这是和AutoResetEvent的区别//2.ManualResetEvent调用Set()后需要手动Reset(),将信号 设置为非终止状态,只有非终止状态线程中调用WaitOne()才能导所在的致线程阻止。static void Main2(string[] args){Thread t = null;//初始化非终止状态,WaitOne()可以直接阻塞所在的线程ManualResetEvent Event = new ManualResetEvent(false);for (int i = 0; i < 2; i++){t = new Thread(() =>{while (true){//阻塞当前线程Event.WaitOne();Console.WriteLine("我是线程:" + Thread.CurrentThread.Name);                        Event.ReSet();Thread.Sleep(1000);}});t.Name = i + "";t.Start();}//5秒后允许所有阻塞的线程继续。Thread.Sleep(5000);Event.Set();//PS:如果使用ManualResetEvent将5个线程阻塞,则需要调用1次Set(),将允许所有阻塞的线程继续执行;如果再次阻塞时,则需要手动调用Reset();Console.ReadLine();}}

备注:信号量

C# ManualResetEvent和AutoResetEvent 使用笔记相关推荐

  1. C# 总结ManualResetEvent与AutoResetEvent【一】

    C# 总结ManualResetEvent与AutoResetEvent[一] ManualResetEvent: ManualResetEvent 允许线程通过发信号互相通信.通常,此通信涉及一个线 ...

  2. c#线程学习之ManualResetEvent和AutoResetEvent的区别!

    AutoResetEvent在.Net多线程编程中经常用到.当某个线程调用WaitOne方法后,信号处于发送状态,该线程会得到信号, 程序就会继续向下执行,否则就等待.而且 AutoResetEven ...

  3. .Net 中 ManualResetEvent 和 AutoResetEvent 的区别

    在 .Net 多线程中可以使用 ManualResetEvent 和 AutoResetEvent 来协调不同的线程的运行.文档中说这两个类都可以通过 set 方法释放信号,等待信号的线程可以通过捕获 ...

  4. C#使用ManualResetEvent和AutoResetEvent处理线程通信

    示例 两个线程交替输出"1 a 2 b 3 c 4 d 5 ....." 代码 //利用ManualResetEvent和AutoResetEvent交替输出"1 a 2 ...

  5. ManualResetEvent,AutoResetEvent 学习

    AutoResetEvent :通知正在等待的线程已发生事件.无法继承此类. ManualResetEvent:通知一个或多个正在等待的线程已发生事件.无法继承此类. using System; us ...

  6. 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析

    AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...

  7. 【深度好文】多线程之WaitHandle--派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent...

    AutoResetEvent/ManualResetEvent 都是继承自 EventWaitHandle ,EventWaitHandle继承自WaitHandle. 在讨论这个问题之前,我们先了解 ...

  8. c# AutoResetEvent和ManualResetEvent

    网上有很多AutoResetEvent和ManualResetEvent的详细介绍,在这里不做过多详细的解释,写下自己的一点心得留作备忘. AutoResetEvent和ManualResetEven ...

  9. C# 线程的挂起与唤醒 (AutoResetEvent,ManualResetEvent)

    如果说C#和C++有什么不同,博主不得不说,对于异步的支持程度是C#的一一个伟大的进步. 其实早期的C++都没有异步,并发的概念.博主第一次使用C++创建异步程序的时候,是使用boost库的内容进行实 ...

  10. C# ManualResetEvent

    原文链接 http://dotnetpattern.com/threading-manualresetevent ManualResetEvent 和AutoResetEvent一样,是另外一种.NE ...

最新文章

  1. Asp.net下实现隐藏真实下载地址(可以实现简单的防盗链)
  2. 使用SqlBulkCopy进行数据大批量的迁移
  3. FIR调用DSP48E_05
  4. [九省联考2018]IIIDX 贪心 线段树
  5. 程序员面试金典 - 面试题 08.05. 递归乘法(位运算)
  6. 面向对象设计的重要原则:SOLID
  7. python全栈开发基础【补充】包的补充
  8. java 方法 示例_Java方法参考类型和示例
  9. 格雷希尔GripSeal螺纹接头的规格型号
  10. 高德地图热力图,高德自带热力图heatmap
  11. 基于.Net Core3.1 与signalR实现一个即时通讯工具(一)
  12. “平步青云”:Oracle系统平台技术助力企业私有云建设
  13. Chrome(谷歌)浏览器调试教程珍藏版
  14. 【微信小程序】实现页面跳转功能
  15. Echarts - 去掉图表上的横线和竖线
  16. 永磁直流无刷电机设计之路(四)——仿真计算分析
  17. python字典序列化是什么意思_为什么python拒绝在一个特殊的cas下序列化这个字典...
  18. 计算机激光鼠标,激光鼠标是什么
  19. VMware导出ovf和ova格式文件
  20. 同步助手 java_八大手机平台全覆盖 QQ同步助手Java版发布

热门文章

  1. Mysql 远程登陆配置
  2. Cisco实例1—构建高可用性DM×××网络2—方案设计
  3. devtmpfs文件系统创建设备节点
  4. 一个apk调用另一个apk的某个activity
  5. TensorFlow入门:Feed和Fetch
  6. C++设计模式10--命令模式(一)--降低请求发送者与接收者耦合
  7. python 连通区域检测_浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)...
  8. C++STL之双端队列Deque
  9. 比较x^y和y^x的大小
  10. 企业级数据服务的一点感受