线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号。如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程
通过调用 Set 发出资源可用的信号。

调用 Set 向 AutoResetEvent 发信号以释放等待线程。AutoResetEvent 将保持终止状态,直到一个正在等待的线程被释放,然后自动返回非终止状态。如果没有任何线程在等待,则状态将无限期地保持为终止状态。

可以通过将一个布尔值传递给构造函数来控制 AutoResetEvent 的初始状态,如果初始状态为终止状态,则为false;否则为 true。通俗的来讲只有等myResetEven.Set()成功运行后,myResetEven.WaitOne()才能够获得运行机会;Set是发信号,WaitOne是等待信号,只有发了信号,等待的才会执行。如果不发的话,WaitOne后面的程序就永远不会执行。WaitOne会根据Set改变的myResetEven的值来判断是否执行,Set后myResetEven值变为true,相当于绿灯可以通过,为fasle相当于红灯不能通过,代码不执行。

P.S.需要注意Set方法只能将值改为true,如果需要改为false 用Reset方法。

P.S.2

AutoResetEvent与ManualResetEvent的区别

他们的用法\声明都很类似,Set方法将信号置为发送状态 Reset方法将信号置为不发送状态WaitOne等待信号的发送。其实,从名字就可以看出一个手动,
一个自动,这个手动和自动实际指的是在Reset方法的处理上,如下面例子:

public AutoResetEvent autoevent=new AutoResetEvent(true);
public ManualResetEvent manualevent=new ManualResetEvent(true);

默认信号都处于发送状态,

autoevent.WaitOne();
manualevent.WaitOne();如果 某个线程调用上面该方法,则当信号处于发送状态时,该线程会得到信号,得以继续执行。差别就在调用后,autoevent.WaitOne()每次只允许一个线程进入,当某个线程得到信号(也就是有其他线程调用了autoevent.Set()方法后)后,autoevent会自动又将信号置为不发送状态,则其他调用WaitOne的线程只有继续等待.也就是说,autoevent一次只唤醒一个线程。而manualevent则可以唤醒多个线程,因为当某个线程调用了set方法后,其他调用waitone的线程获得信号得以继续执行,而manualevent不会自动将信号置为不发送.也就是说,除非手工调用了manualevent.Reset().方法,则manualevent将一直保持有信号状态,manualevent也就可以同时唤醒多个线程继续执行。如果程序中换成ManualResetEvent的话,就需要在waitone后面做下reset。

转载于:https://www.cnblogs.com/ShadowFiend007/p/5189971.html

AutoResetEvent类的使用相关推荐

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

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

  2. 艾伟:C#多线程学习(六) 互斥对象

    本系列文章导航 C#多线程学习(一) 多线程的相关概念 C#多线程学习(二) 如何操纵一个线程 C#多线程学习(三) 生产者和消费者 C#多线程学习(四) 多线程的自动管理(线程池) C#多线程学习( ...

  3. C# 多线程学习总结

    C#多线程学习(一) 多线程的相关概念 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的. 什么是线程? 线程是 ...

  4. vb.net 线程偶尔不会自动关闭_C# 多线程系列(7)手动线程通知

    区别与示例 AutoResetEvent 和 ManualResetEvent 十分相似.两者之间的区别,在于前者是自动(Auto),后者是手动(Manua). 你可以先运行下面的示例,再测试两者的区 ...

  5. C#多线程编程实战(二):线程同步

    2.1 简介 竞争条件:多个线程同时使用共享对象.需要同步这些线程使得共享对象的操作能够以正确的顺序执行 线程同步问题:多线程的执行并没有正确的同步,当一个线程执行递增和递减操作时,其他线程需要依次等 ...

  6. 多线程并发:每个开发人员都应了解的内容

    各种类型的 源码,书籍,工具等 进入 磐实资源站 可以找到.网址 --> www.panshsoft.net   如果你有好的文章,源码提供给本站 可以进入 bbs.panshsoft.com ...

  7. C#的多线程(2)——机制探索

    注:本文中出现的代码均在.net Framework RC3环境中运行通过 一.多线程的概念 Windows是一个多任务的系统,如果你使用的是windows 2000及 其以上版本,你可以通过任务管理 ...

  8. C#多线程学习6——互斥对象

    如何控制好多个线程相互之间的联系,不产生冲突和重复,这需要用到互斥对象,即:System.Threading 命名空间中的 Mutex 类. 我们可以把Mutex看作一个出租车,乘客看作线程.乘客首先 ...

  9. C#中利用委托实现多线程跨线程操作

    在使用VS2005的时候,如果你从非创建这个控件的线程中访问这个控件或者操作这个控件的话就会抛出这个异常.这是微软为了保证线程安全以及提高代码的效率所做的改进,但是也给大家带来很多不便. 其实解决这个 ...

  10. [转]关于多线程并发:每个开发人员都应了解的内容(转自Mainz's)

    Concurrency: What Every Dev Must Know About Multithreaded Apps 本文讨论: 多线程和共享内存线程模型 争用及并发访问如何能够打破不变量 作 ...

最新文章

  1. Electron的代码调试
  2. .vb.net 执行js方法_Deno的执行机制
  3. html 脚本 gdi,基于gdi的简单画图
  4. 开源 java CMS - FreeCMS2.7 移动端栏目页静态化
  5. Android 悬浮按钮 两种实现方法
  6. 阿里巴巴中台技术架构实践与思考
  7. Start Developing iOS Apps Today系列之应用程序(七)
  8. 专辑名称:极品汽车发烧音乐精选-音乐宝典18CD(金碟收藏版)
  9. 图标在XMind中应用
  10. One Step By One Step 解析OkHttp3 - Dispatcher (一)
  11. 使用frps建立内网穿透从而实现外界连接内网电脑的全教程
  12. react native 动画组件(Animated)浅析
  13. 国行版苹果 ios 按键精灵无法联网问题处理
  14. 设计模式---单例模式Singleton
  15. docker私服配置
  16. 数仓 - 促销敏感度、评论敏感度
  17. HTML旅游网页设计制作 DW旅游网站官网滚动网页 DIV旅游风景介绍网页设计与实现...
  18. 解决 MUI QQ登陆功能报错“该应用非官方正版应用,请到......100044”
  19. 课工场大数据学员从技术晋升到PMO,年薪突破39万元
  20. 关于H1N1的预防,目前为止最好的忠告

热门文章

  1. cublas中执行矩阵乘法运算的函数 首先要注意的是cublas使用的是以列为主的存储方式,和c/c++中的以行为主的方式是不一样的。处理方法可参考下面的注释代码
  2. Spring Framework的核心:Spring AOP
  3. [转]一阶自回归模型和二阶自回归模型
  4. 图像处理笔记(十七):再看傅里叶变换
  5. 【知识笔记】WebForm
  6. 导航菜单点击后高亮显示
  7. linux网络 (二):无线网络操作
  8. IOS6 编程:Core Data持久化数据存储(5)-使用Core Data模板创建EntLibCart项目
  9. 若何设定Linux把持系统的启动暗码
  10. 令人失望的vb 的范型