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键. 对于值是数组类型的 ...
随机推荐
- JavaWeb学习笔记--Listener
JSP中的监听器 Web程序在服务器运行的过程中,程序内部会发生多事件,如Web应用的启动和停止.Session会话的开始和销毁.用户请求的开始和结束等等.有时程序员需要在这些事件发生的时机执行一 ...
- JUnit使用Eclipse建立Test Suite - 就是爱Java
当JUnit有多个或所有的Test Case要执行,此时就需要Test Suite来管理众多的Test Case,利用Eclipse的整合开发环境,可以针对多个不相关的Test Case或Test S ...
- 浅谈PCB敷铜的“弊与利”
敷铜作为PCB设计的一个重要环节,不管是国产的青越锋PCB设计软件,还国外的一些Protel,PowerPCB都提供了智能敷铜功能,那么怎样才能敷好铜,我将自己一些想法与大家一起分享,希望能给同行带来 ...
- Linux下查看文件夹或目录大小
当磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择. df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. du可以查看文件及文件夹的大小.d ...
- BZOJ2697: 特技飞行
2697: 特技飞行 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 607 Solved: 363[Submit][Status] Descript ...
- 【转】Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)
Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法) 鼠标右键项目,然后属性,然后java buildpath 然后order and ex ...
- bzoj 1196
http://www.lydsy.com/JudgeOnline/problem.php?id=1196 二分+并查集 一共有2*M条路径,我们首先将这2*M条路径按费用排序. 然后二分最大费用的公路 ...
- Delphi 使用 Format格式话字符串的用法
找出以前的代码,写个随笔, 又想起以前的公司和以前的同事来, 希望以前的公司和同事事事顺意. //返回格式化的字符串function TfrmLedgerExVoucherLoad.GetFormat ...
- joomla学习网站资料
http://joomlaol.com/joomla-chinese/joomla-study/340-joomla-skills.html joomla的强大相信学过和用过joomla的童鞋都知道吧 ...
- c#秒转时分秒
2个办法 @{ int hour = item.track / 3600; int min = (item.track - hour * 3 ...