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 类的使用说明的更多相关文章

  1. AutoResetEvent类的使用

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

  2. class(类的使用说明)

    class 的三大特性 封装:内部调用对于外部用户是透明的 继承: 在分类里的属性,方法被自动继承 多态:调用这个功能,可以使多个类同时执行 r1 = Role(r1, 'Alex', 'Police ...

  3. 【jpeg_Class 类】使用说明

    jpeg_Class类是针对图片操作类,可以获取图片属性.等比例缩略图片.裁切图片.图片上打印文字及打印水印等功能. 目录 原型 参数 返回 说明 Sub load(byVal path) path ...

  4. 【xml_Class、xmlElementNode_Class 类】使用说明

    xml_Class.xmlElementNode_Class这两个类是针对XML相关操作的类. 1.xml_Class类是针对XML文档操作的类 目录: 类型 原型 参数 返回 说明 Sub Sub ...

  5. 【paging_Class 分页类】使用说明

    类名:paging_Class 说明:分页类 注意: 1) 支持百万级数据分页 2) 支持多种类型的SQL语法,比如 Left Join 等. 3) 自动保存查询中的错误情况,记录保存在:/Cache ...

  6. 【outPut_Class 输出类】使用说明

    对象:outPut 说明:定义输出结果类的相关操作.此对象的核心是[JSON]类,所以它继承了[JSON]类的所有方法 重要: 输出结果样式为XML时,自带根节点"root".输出 ...

  7. String类的使用说明

    (1)Length()取一个字符串的长度:public int length(); public calss StringLength1{ public static void main(String ...

  8. 【xmlHttp_Class 远程访问类】使用说明

    类名:xmlHttp_Class 说明:远程获取外部网站数据信息或执行一个外部网站程序 目录: 类型 名称 参数 返回 说明 属性 [必需] [xmlHttp].url = [urlString] - ...

  9. 【JSON类】使用说明

    理解键名路径 键名路径(keyPath)用于定位json的键,比如:{book: {title:”中国人”} },键名路径 book.title 表定位到book下的title键. 对于值是数组类型的 ...

随机推荐

  1. unexpected problem

    一个比较有趣的字符串问题,问题描述如下 大体意思就是给定一个字符串s以及一个整数m,找出一个能满足以上三个条件的字符串t的个数对10e9 + 7 取余输出. 第二三条是关键,t.s = s.t 举个例 ...

  2. hdu Joseph

    #include <cstdio> #include <iostream> #include <algorithm> using namespace std; ]; ...

  3. FB是磁珠的符号

    本文来自:http://www.coofish.org/post/FB-cizhu.html今天实验室一哥们研究DSP电路图,发现图中有一个符号是FB,外形有点像电阻(R),但是不清楚是什么电子元器件 ...

  4. Windows进程间通信的各种方法

    原文:Windows进程间通信的各种方法 进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码.数据以及它可利用的系统资源(如文件.管道等)组成.多进程/多线程是Windows操作系 ...

  5. windows下重命名一个带有前缀"."dot字符的名字的错误问题

    如果用正常的右键重命名那么肯定会报错的,比如: 有一个名为project的文件,我想把它命名为.project,加了个前缀dot.然后window就报错了,弹出个对话框让“你必须输入一个文件名”.它可 ...

  6. 关于IoCallDriver

    通常我们所知IoCallDriver是把irp传递给下一层设备,传递到底是什么意思呢?IoCallDriver中实际调用了IopfCallDriver,其代码如下:NTSTATUSFORCEINLIN ...

  7. netstat命令, netstat指令在windows和linux有什么不同

    查看当前tcp监听端口[op@TIM html]$ netstat -nltp(Not all processes could be identified, non-owned process inf ...

  8. 如何备份及恢复Linux文件权限

    你可能听说或碰到过这样的事情:一个系统管理员菜鸟不小心输入"chmod -R 777 /"从而导致了巨大的悲剧,使得整个系统遭到了严重的破坏.在日常管理中,我们有许多工具可以用来备 ...

  9. C# Excel导入、导出

    本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...

  10. BeyondCompare两个文件中同一行字符长度不一致的文件对比,比如pi文件对比(xjl456852原创)

    假设有两个文件,里面存放的数字都只有一行,但长度不一样,对比时会有问题 示例文件: 对比示例如图: 左边的pi的字符串比较长,右边的比较短. 右边的pi的值不是从开始的第一个位置对比的,这样的情况是有 ...