AutoResetEvent 类的使用说明

AutoResetEvent 类异步

官方描述通知正在等待的线程已发生事件函数

命名空间:System.Threadingui

程序集:mscorlibspa

继承于:System.Threading.WaitHandle线程

 

AutoResetEvent从字面理解就是自动重置事件,那么它具体作什么的呢?举个例子:你们都坐过动车,要上车以前你们都要通过检票口的一道自动检票门,插入一张车票门就打开,人走过去以后门就自动关闭,保证一张车票过一我的,那么AutoResetEvent的做用就是这道自动检票门!blog

简单了解了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();
        }
    }
}
相关文章
相关标签/搜索