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. commons-logging log4j的联系区别

    1.Apache通用日志接口(commons-logging.jar)介绍 Apache Commons包中的一个,包含了日志功能,必须使用的jar包.这个包本身包含了一个Simple Logger, ...

  2. Android 颜色大全 (colors.xml )

    <resources> <color name="pink">#ffc0cb</color><!--粉红色 --> <colo ...

  3. Codeforces 526E Transmitting Levels

    http://codeforces.com/contest/526/problem/E 题意:给一个环,每个点有权值,每次给一个数B,求把这个环切割成若干部分,每个部分不超过B,至少要切成几块? #i ...

  4. 疯狂delphi - 朱建强 (一些小例子很实用,也是我所关心的几个问题)

    疯狂delphi - 朱建强 (一些小例子很实用,也是我所关心的几个问题) Android实例-获取安卓手机WIFI信息(XE8+小米2)http://www.cnblogs.com/FKdelphi ...

  5. 自定义高级QFileDialog文件过滤器

    QFileDialog提供了一个函数---setproxyModel..就是用这个来玩了.就是override filterAcceptsRow的虚函数,里面定制自己的过滤需求.返回bool   下面 ...

  6. SIP学习之网络链接

    风清扬的CSDN博客  文章分类SIP http://blog.csdn.net/ppy521/article/category/1227390

  7. git 技巧

    将某个文件回退到某个版本 git co d359624286d9c1f022b8b3b6f2d3fe3b6524188b build.sh 查看某个文件在某个版本时的内容 git show d3596 ...

  8. [置顶] cJSON库(构建json与解析json字符串)-c语言

     一.c语言获取json中的数据. 1.先要有cJOSN库,两个文件分别是cJSON.c和cJSON.h. 2.感性认识 char * json = "{ \"json\" ...

  9. EL 表达式中自己定义函数

    第一步: 在WEB-INF/tld/ 文件夹下创建一个func.tld文件例如以下: <taglib xmlns="http://java.sun.com/xml/ns/j2ee&qu ...

  10. android EditText插入字符串到光标所在位置

    EditText mTextInput=(EditText)findViewById(R.id.input);//EditText对象 int index = mTextInput.getSelect ...