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();
        }
    }
}
相關文章
相關標籤/搜索