C# ManualResetEvent和AutoResetEvent 使用笔记
一、两者区别
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 使用笔记相关推荐
- C# 总结ManualResetEvent与AutoResetEvent【一】
C# 总结ManualResetEvent与AutoResetEvent[一] ManualResetEvent: ManualResetEvent 允许线程通过发信号互相通信.通常,此通信涉及一个线 ...
- c#线程学习之ManualResetEvent和AutoResetEvent的区别!
AutoResetEvent在.Net多线程编程中经常用到.当某个线程调用WaitOne方法后,信号处于发送状态,该线程会得到信号, 程序就会继续向下执行,否则就等待.而且 AutoResetEven ...
- .Net 中 ManualResetEvent 和 AutoResetEvent 的区别
在 .Net 多线程中可以使用 ManualResetEvent 和 AutoResetEvent 来协调不同的线程的运行.文档中说这两个类都可以通过 set 方法释放信号,等待信号的线程可以通过捕获 ...
- C#使用ManualResetEvent和AutoResetEvent处理线程通信
示例 两个线程交替输出"1 a 2 b 3 c 4 d 5 ....." 代码 //利用ManualResetEvent和AutoResetEvent交替输出"1 a 2 ...
- ManualResetEvent,AutoResetEvent 学习
AutoResetEvent :通知正在等待的线程已发生事件.无法继承此类. ManualResetEvent:通知一个或多个正在等待的线程已发生事件.无法继承此类. using System; us ...
- 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析
AutoResetEvent 允许线程通过发信号互相通信. 通常,当线程需要独占访问资源时使用该类. 线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号. 如果 AutoRe ...
- 【深度好文】多线程之WaitHandle--派生EventWaitHandle事件构造-》AutoResetEvent、ManualResetEvent...
AutoResetEvent/ManualResetEvent 都是继承自 EventWaitHandle ,EventWaitHandle继承自WaitHandle. 在讨论这个问题之前,我们先了解 ...
- c# AutoResetEvent和ManualResetEvent
网上有很多AutoResetEvent和ManualResetEvent的详细介绍,在这里不做过多详细的解释,写下自己的一点心得留作备忘. AutoResetEvent和ManualResetEven ...
- C# 线程的挂起与唤醒 (AutoResetEvent,ManualResetEvent)
如果说C#和C++有什么不同,博主不得不说,对于异步的支持程度是C#的一一个伟大的进步. 其实早期的C++都没有异步,并发的概念.博主第一次使用C++创建异步程序的时候,是使用boost库的内容进行实 ...
- C# ManualResetEvent
原文链接 http://dotnetpattern.com/threading-manualresetevent ManualResetEvent 和AutoResetEvent一样,是另外一种.NE ...
最新文章
- Asp.net下实现隐藏真实下载地址(可以实现简单的防盗链)
- 使用SqlBulkCopy进行数据大批量的迁移
- FIR调用DSP48E_05
- [九省联考2018]IIIDX 贪心 线段树
- 程序员面试金典 - 面试题 08.05. 递归乘法(位运算)
- 面向对象设计的重要原则:SOLID
- python全栈开发基础【补充】包的补充
- java 方法 示例_Java方法参考类型和示例
- 格雷希尔GripSeal螺纹接头的规格型号
- 高德地图热力图,高德自带热力图heatmap
- 基于.Net Core3.1 与signalR实现一个即时通讯工具(一)
- “平步青云”:Oracle系统平台技术助力企业私有云建设
- Chrome(谷歌)浏览器调试教程珍藏版
- 【微信小程序】实现页面跳转功能
- Echarts - 去掉图表上的横线和竖线
- 永磁直流无刷电机设计之路(四)——仿真计算分析
- python字典序列化是什么意思_为什么python拒绝在一个特殊的cas下序列化这个字典...
- 计算机激光鼠标,激光鼠标是什么
- VMware导出ovf和ova格式文件
- 同步助手 java_八大手机平台全覆盖 QQ同步助手Java版发布
热门文章
- Mysql 远程登陆配置
- Cisco实例1—构建高可用性DM×××网络2—方案设计
- devtmpfs文件系统创建设备节点
- 一个apk调用另一个apk的某个activity
- TensorFlow入门:Feed和Fetch
- C++设计模式10--命令模式(一)--降低请求发送者与接收者耦合
- python 连通区域检测_浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)...
- C++STL之双端队列Deque
- 比较x^y和y^x的大小
- 企业级数据服务的一点感受