AutoResetEvent 類異步
官方描述:通知正在等待的線程已發生事件函數
命名空間:System.Threadingui
程序集:mscorlibspa
繼承於:System.Threading.WaitHandle線程
AutoResetEvent從字面理解就是自動重置事件,那麼它具體作什麼的呢?舉個例子:你們都坐過動車,要上車以前你們都要通過檢票口的一道自動檢票門,插入一張車票門就打開,人走過去以後門就自動關閉,保證一張車票過一我的,那麼AutoResetEvent的做用就是這道自動檢票門!blog
簡單瞭解了AutoResetEvent的做用後,咱們來看看經常使用的函數:繼承
示例:使用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(); } } }