AutoResetEvent 类的使用说明
AutoResetEvent 类
官方描述:通知正在等待的线程已发生事件
命名空间:System.Threading
程序集:mscorlib
继承于:System.Threading.WaitHandle
AutoResetEvent从字面理解就是自动重置事件,那么它具体做什么的呢?举个例子:大家都坐过动车,要上车之前大家都要经过检票口的一道自动检票门,插入一张车票门就打开,人走过去之后门就自动关闭,保证一张车票过一个人,那么AutoResetEvent的作用就是这道自动检票门!
简单了解了AutoResetEvent的作用后,我们来看看常用的函数:
- AutoResetEvent(bool initialState) 构造函数,initialState参数设置门的初始状态;true 初始化开着门,就是第一个通过的人不需要票,false 初始化关着门,众生平等都要票。
- WaitOne() 阻塞当前线程,直到接收到信号;官方说明有点错误,阻不阻塞线程取决于当前门的状态,如果门开着就不阻塞,反之则阻塞,如果初始化initialState设置为ture,那么第一次调用该函数是不会阻塞的,当然调用该函数的地方就是安装自动检票门的地方; WaitOne还提供间隔时间timeout的重载函数,作用就是在该间隔时间内没有插入票,那么门将自动打开。
- Set() 将事件状态设置为终止状态,允许一个或多个等待线程继续;该函数就是插入票的动作,命令开门,直到一个人通过后关闭;允许多个等待线程继续的意思就是同一个AutoResetEvent实例在多处调用WaitOne函数时,Set()函数将把这些门全部打开;该函数返回一个bool类型的值,ture表示门已经成功打开,false表示门本来就是开着的什么都没发生。
- Reset() 将事件状态设置为非终止状态,导致线程阻止;该函数是手动关闭门的命令,返回bool类型的值,ture表示门已经成功关闭,false表示门本来就是关闭的什么都没发生
示例:使用AutoResetEvent代替Thread.Sleep实现列队异步工作,来减少获取线程的获取的时间片
public class QueueWork<T> : IDisposable
{
private readonly Queue<T> _queue = new Queue<T>();
private readonly Thread _workerThread;
private readonly object _locker = new object();
private readonly AutoResetEvent _waitEvent;
private readonly Action<T> _workHandler; public QueueWork(Action<T> workHandler){
_workerThread = new Thread(Work);
_waitEvent = new AutoResetEvent(false);
_workHandler = workHandler;
} public void Add(T data){
lock(_locker){
_queue.Enqueue(data);
}
_waitEvent.Set();
} private static void Work(){
while (!_isDisposed)
{
T data;
lock(_locker){
if(_queue.Count>0){
data = _queue.Dequeue()
}
} if(data == null){
_waitEvent.WaitOne();
continue;
} try{
workHandler(data);
}catch{}
}
} private bool _isDisposed = false;
public void Dispose(){
if(!_isDisposed){
_waitEvent.Set();
_workerThread.Join();
_waitEvent.Dispose();
}
}
}
AutoResetEvent 类的使用说明的更多相关文章
- AutoResetEvent类的使用
线程通过调用 AutoResetEvent 上的 WaitOne 来等待信号.如果 AutoResetEvent 处于非终止状态,则该线程阻塞,并等待当前控制资源的线程通过调用 Set 发出资源可用的 ...
- class(类的使用说明)
class 的三大特性 封装:内部调用对于外部用户是透明的 继承: 在分类里的属性,方法被自动继承 多态:调用这个功能,可以使多个类同时执行 r1 = Role(r1, 'Alex', 'Police ...
- 【jpeg_Class 类】使用说明
jpeg_Class类是针对图片操作类,可以获取图片属性.等比例缩略图片.裁切图片.图片上打印文字及打印水印等功能. 目录 原型 参数 返回 说明 Sub load(byVal path) path ...
- 【xml_Class、xmlElementNode_Class 类】使用说明
xml_Class.xmlElementNode_Class这两个类是针对XML相关操作的类. 1.xml_Class类是针对XML文档操作的类 目录: 类型 原型 参数 返回 说明 Sub Sub ...
- 【paging_Class 分页类】使用说明
类名:paging_Class 说明:分页类 注意: 1) 支持百万级数据分页 2) 支持多种类型的SQL语法,比如 Left Join 等. 3) 自动保存查询中的错误情况,记录保存在:/Cache ...
- 【outPut_Class 输出类】使用说明
对象:outPut 说明:定义输出结果类的相关操作.此对象的核心是[JSON]类,所以它继承了[JSON]类的所有方法 重要: 输出结果样式为XML时,自带根节点"root".输出 ...
- String类的使用说明
(1)Length()取一个字符串的长度:public int length(); public calss StringLength1{ public static void main(String ...
- 【xmlHttp_Class 远程访问类】使用说明
类名:xmlHttp_Class 说明:远程获取外部网站数据信息或执行一个外部网站程序 目录: 类型 名称 参数 返回 说明 属性 [必需] [xmlHttp].url = [urlString] - ...
- 【JSON类】使用说明
理解键名路径 键名路径(keyPath)用于定位json的键,比如:{book: {title:”中国人”} },键名路径 book.title 表定位到book下的title键. 对于值是数组类型的 ...
随机推荐
- Swift类和结构体定义-备
Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { 定义类的成员 } struct 结构体名 { ...
- javascript 事件触发
http://www.zhangxinxu.com/wordpress/2012/04/js-dom%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BA%8B%E4%BB%B6/ htt ...
- pfsense 2.2RC版本应用
为什么要上RC版本呢?因为华硕主板有一个RTL8111G驱动在2.15中还没有识别.... 公司双线WAN,一个PPPOE一个静态IP. 开了端口转发, 要求对不同的IP进行相关限速, 到达指定网站用 ...
- 那年曾让我哭笑不得抓狂的C语言
1.关于+=以及-= 这是两个运算符,但你否有过这种经历: int temp; char i ;i<MAX;i++) { ... temp=+; //这里本意是每次循环,temp都自增2,但是却 ...
- Visio 下载,及密钥
Visio2010简体中文高级版(永久激活密钥:GR24B-GC2XY-KRXRG-2TRJJ-4X7DC) ed2k://|file|cn_visio_2010_x64_516562.exe|515 ...
- logstash ArgumentError: comparison of String with 5 failed
<pre name="code" class="html"><pre name="code" class="ht ...
- c#类和结构体的关系
原文地址:http://www.dnbcw.com/biancheng/c/fvhc81798.html 简介:这是c#类和结构体的关系的详细页面,介绍了和c/c++,有关的知识,谢谢大家的观看!要查 ...
- Android Studio:You need to use a Theme.AppCompat theme (or descendant) with this activity. AlertDialog
学习<第一行代码>的时候遇到的问题. Process: com.example.sevenun.littledemo, PID: 2085 java.lang.RuntimeExcepti ...
- JAVA泛型编程笔记
1介绍 Java泛型编程是JDK1.5版本后引入的.泛型让编程人员能够使用类型抽象,通常用于集合里面. 下面是一个不用泛型例子: List myIntList=new LinkedList(); // ...
- 源码分析之spring-JdbcTemplate日志打印sql语句
对于开源的项目来说的好处就是我们遇到什么问题可以通过看源码来解决. 比如近期有个同事问我说,为啥JdbcTemplate中只有在Error的时候才打印出sql语句呢.我一想,这和log的配置有关系吧. ...