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 = ; i < ; i++)
{
t = new Thread(() =>
{
while (true)
{
//阻塞当前线程
Event.WaitOne();
Console.WriteLine("我是线程:" + Thread.CurrentThread.Name);
Thread.Sleep();
}
});
t.Name = i + "";
t.Start();
}
//5秒后允许一个等待的线程继续。当前允许的是线程1
Thread.Sleep();
Event.Set();
//5秒后允许一个等待的线程继续。当前允许的是线程2
Thread.Sleep();
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 = ; i < ; i++)
{
t = new Thread(() =>
{
while (true)
{
//阻塞当前线程
Event.WaitOne();
Console.WriteLine("我是线程:" + Thread.CurrentThread.Name);
Event.ReSet();
Thread.Sleep();
}
});
t.Name = i + "";
t.Start();
}
//5秒后允许所有阻塞的线程继续。
Thread.Sleep();
Event.Set();
//PS:如果使用ManualResetEvent将5个线程阻塞,则需要调用1次Set(),将允许所有阻塞的线程继续执行;如果再次阻塞时,则需要手动调用Reset();
Console.ReadLine();
}
}
备注:信号量
C# ManualResetEvent和AutoResetEvent 使用笔记的更多相关文章
- 【C#】【Thread】ManualResetEvent和AutoResetEvent区别
ManualResetEvent和AutoResetEvent主要用于线程之间同步问题. 主要使用方法有Set();Reset();WaitOne(); Set():将事件状态设置为终止状态,允许一个 ...
- ManualResetEvent和AutoResetEvent的区别实例
ManualResetEvent和AutoResetEvent的作用可以理解为在线程执行中插入停顿点flag终止程序运行,然后通过设置flag的状态来使得程序继续运行. 两者的区别是:ManualRe ...
- C#多线程之二:ManualResetEvent和AutoResetEvent
初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...
- ManualResetEvent和AutoResetEvent的区别
在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...
- 对ManualResetEvent和AutoResetEvent的巩固练习
在多线程编程中,最常用到的就是线程同步问题,前段时间开发地址采集服务器,需要携带经纬度到MapAbc中采集后,返回地址,才可以进行下一条经纬度的采集,因为队列处理和解析不是同一个线程,并且是解析经纬度 ...
- 211. Orchard学习 二 2、ManualResetEvent 与 AutoResetEvent
一.Orchard里异步请求处理线程队列的控制 Orchard的Orchard.WarmupStarter模块,为HttpApplication.BeginRequest时间附加了一个异步处理事件:B ...
- C# 多线程学习系列四之ThreadPool取消、超时子线程操作以及ManualResetEvent和AutoResetEvent信号量的使用
1.简介 虽然ThreadPool.Thread能开启子线程将一些任务交给子线程去承担,但是很多时候,因为某种原因,比如子线程发生异常.或者子线程的业务逻辑不符合我们的预期,那么这个时候我们必须关闭它 ...
- C#多线程之 ManualResetEvent和AutoResetEvent
初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...
- ManualResetEvent和AutoResetEvent的区别,分享来的
在讨论这个问题之前,我们先了解这样一种观点,线程之间的通信是通过发信号来进行沟通的.(这不是废话) 先来讨论ManualResetEvent,讨论过程中我会穿插一些AutoResetEvent的内容, ...
随机推荐
- Centering, Scaling and Normalizing
Centering: 使数据的均值(Empirical Mean)变为0的过程. 具体操作:原始数据Xn(n=1, 2, 3, ..., n)减去均值. Scaling: 使数据的标准差(Empiri ...
- UItextView回收键盘的几种方式
1.如果你程序是有导航条的,可以在导航条上面加多一个Done的按钮,用来退出键盘,当然要先实UITextViewDelegate. 代码如下: - (void)textViewDidBeginEdit ...
- DedeCMS Xss+Csrf Getshell \dede\file_manage_control.php
目录 . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 对这个漏洞的利用方式进行简单的概括 . 这个漏洞的利用前提是需要登录到后台进行操作 ...
- MongoDB安装,配置
安装 cd /usr/local/srcwget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.6.tgztar z ...
- 关于Unity3d粒子系统的小发现(天堂3技能释放)
导入系统给的粒子包,发现了一个问题:系统的粒子都有移动轨迹. 而自己新建的空粒子系统却没有这个功能.顺便也复习一下粒子系统. Particle System (粒子系统): Duration(持续时间 ...
- C#位操作与枚举的应用
看到代码里有用位操作来判断条件的,以前没有这么用过,做个笔记: int add = 2; int modify = 4; int delete = 8; Console.WriteLine((add ...
- sed命令给文本文件的每行的行首或者行尾添加文字
在每行的头添加字符,比如"HEAD",命令如下: sed 's/^/HEAD&/g' test.file 在每行的行尾添加字符,比如“TAIL”,命令如下: sed 's/ ...
- hihocoder 1356 分隔相同整数
时间限制:10000ms单点时限:1000ms内存限制:256MB 描述 给定一个包含N个整数的数组A.你的任务是将A重新排列,使得任意两个相等的整数在数组中都不相邻. 如果存在多个重排后的数组满足条 ...
- HTML5学习总结-01 开发环境和历史
1 搭建HTML5开发环境 1 安装一款支持HTML5的浏览器 FireFox, Chrome 2 开发工具 SublineText, Eclipse, HBuilder, WebStorm 注:使用 ...
- zabbix监控系列(3)之zabbix触发器格式配置
前言 今天公司线上环境新添一个监控项,监控 一些日志的是否出现错误,有错误就及时报警,那么问题来了 ,报警必须告诉我们哪个日志有错误,这样才能够快速定位到哪个日志有问题. 配置 zabbix-agen ...