示例

两个线程交替输出“1 a 2 b 3 c 4 d 5 .....”

代码

    //利用ManualResetEvent和AutoResetEvent交替输出“1 a 2 b 3 c 4 d 5 .....”//ManualResetEvent和AutoResetEvent不同点://AutoResetEvent 收到 Set 后 , 一次只能执行一个线程,其它线程继续 WaitOne //ManualResetEvent 收到 Set 后,所有处理 WaitOne 状态线程均继续执行//AutoResetEvent.Set() = ManualResetEvent.Set() + ManualResetEvent.Reset();//在.Net多线程编程中,AutoResetEvent和ManualResetEvent这两个类经常用到, 他们的用法很类似,但也有区别。Set方法将信号置为发送状态,//Reset方法将信号置为不发送状态,WaitOne等待信号的发送。可以通过构造函数的参数值来决定其初始状态,若为true则非阻塞状态,为false为阻塞状态。//如果某个线程调用WaitOne方法,则当信号处于发送状态时,该线程会得到信号, 继续向下执行。其区别就在调用后,AutoResetEvent.WaitOne() 每次只允许一个线程进入, //当某个线程得到信号后, AutoResetEvent会自动又将信号置为不发送状态, 则其他调用WaitOne的线程只有继续等待.//也就是说,AutoResetEvent一次只唤醒一个线程;而ManualResetEvent则可以唤醒多个线程,因为当某个线程调用了ManualResetEvent.Set() 方法后, //其他调用WaitOne的线程获得信号得以继续执行, 而ManualResetEvent不会自动将信号置为不发送。也就是说,除非手工调用了ManualResetEvent.Reset() 方法, //则ManualResetEvent将一直保持有信号状态, ManualResetEvent也就可以同时唤醒多个线程继续执行。//本质上AutoResetEvent.Set() 方法相当于ManualResetEvent.Set()+ManualResetEvent.Reset();//因此AutoResetEvent一次只能唤醒一个线程,其他线程还是堵塞class Program{private static List<ManualResetEvent> _listManual = new List<ManualResetEvent>();private static List<AutoResetEvent> _listAuto = new List<AutoResetEvent>();private static List<int> _listNumber = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };private static List<char> _listLetter = new List<char>() { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };//private static List<char> _listUpperLetter = new List<char>() { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J' };static void Main(string[] args){#region ManualResetEvent_listManual.Add(new ManualResetEvent(false));//用于控制_listNumber的信号灯_listManual.Add(new ManualResetEvent(false));//用于控制_listLetter的信号灯Task.Run(() =>{_listNumber.ForEach(c =>{_listManual[0].WaitOne();Console.WriteLine(c);_listManual[0].Reset();_listManual[1].Set();});});Task.Run(() =>{_listLetter.ForEach(c =>{_listManual[1].WaitOne();Console.WriteLine(c);_listManual[0].Set();_listManual[1].Reset();});});_listManual[0].Set();Console.ReadKey();#endregion#region AutoResetEvent_listAuto.Add(new AutoResetEvent(false));//用于控制_listNumber的信号灯_listAuto.Add(new AutoResetEvent(false));//用于控制_listLetter的信号灯Task.Run(() =>{_listNumber.ForEach(c =>{_listAuto[0].WaitOne();Console.WriteLine(c);_listAuto[1].Set();//不需要ReSet,因为AutoResetEvent在某个wait的线程得到信号后会自动变为ReSet,WaitOne每次只允许一个线程进入});});Task.Run(() =>{_listLetter.ForEach(c =>{_listAuto[1].WaitOne();Console.WriteLine(c);_listAuto[0].Set();});});_listAuto[0].Set();Console.ReadKey();#endregion}}//Reset() //红灯//Set() //绿灯//WaitOne() // 等待信号

输出

C#使用ManualResetEvent和AutoResetEvent处理线程通信相关推荐

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

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

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

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

  3. C#线程通信与异步委托

    线程的通知机制 AutoResetEvent是线程实现通知操作的重要方法.通常,AutoResetEvent用于通知正在等待线程已发生事件,允许线程通过发信号互相通信. AutoResetEvent时 ...

  4. C# 使用AutoResetEvent进行线程同步

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

  5. .Net 中 ManualResetEvent 和 AutoResetEvent 的区别

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

  6. ZeroMq实现跨线程通信

    ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void ...

  7. python 线程锁 共享全局变量 线程通信

    python 线程锁 共享全局变量 线程通信 注意:全局变量不必做为参数传到函数里!!! import threading # 银行存钱和取钱 # 存钱1万次 def add():global mon ...

  8. C++多线程:Linux 线程通信,唤醒,互斥锁(未完待续)

    c++ multi thread message sending and notify 线程通信常用的方法有共享内存和消息传递,推荐使用消息传递. 最常用的就是管道了,可以使用匿名管道或者命名管道. ...

  9. Python网络编程(线程通信、GIL、服务器模型)

    什么是进程.进程的概念? 进程的概念主要有两点: 第一,进程是一个实体.每一个进程都有它自己的地址空间, 一般情况下,包括文本区域(text region).数据区域(data region)和堆栈( ...

最新文章

  1. 样式集(三)成功页面样式模板
  2. 云上护航服务—保障云上的尖峰时刻
  3. Intel汇编语言程序设计学习-第三章 汇编语言基础-上
  4. Java之美之设计模式
  5. hdu4506小明系列故事——师兄帮帮忙 (用二进制,大数高速取余)
  6. 自定义SpringBoot项目的Maven原型
  7. python文件夹目录_Python 操作文件、文件夹、目录大全
  8. 城市大脑标准体系与评价指标总体框架研究
  9. 草稿 9203 作业重点关注
  10. ApacheCN 数据库译文集 20211112 更新
  11. 花钱购买C语言教程,秘籍:小白从零开始玩转C语言教程,足足300集
  12. vivado查看原理图
  13. Qt实现图片的简单压缩
  14. 一个牛人在美国的跳槽经历(转)
  15. app 评论功能实现
  16. 【Pandas】计算相关性系数corr()
  17. VR全景的拍摄以及优势
  18. gitlab 配https_gitlab容器--带https配置
  19. 图像处理:双边滤波算法
  20. 系统提示内部服务器错误是怎么回事,XP系统提示“HTTP500内部服务器错误”是怎么回事...

热门文章

  1. 卷积 反卷积 上采样 下采样 区别
  2. 基于SCORM标准课件的移动客户端架构设计
  3. 分享一个火狐浏览器firefox的所有版本所有平台所有国家的地址,一定要收藏好哦^_^
  4. Java虚拟机之垃圾回收详解一
  5. GEOTRANS 3.7 用户使用手册 ------ 文件处理(坐标文件格式)
  6. 思维导图 以及 日历规划软件
  7. 组播屏幕共享、Android屏幕共享开发小结
  8. jQuery插件综合应用(四)头像设置
  9. 从一个Uiautomator的官方demo说源码
  10. 智慧城市数字孪生系统深度融合大数据、云计算等技术应用