public void Set() { List <AsyncWaitHandle.AsyncWaiter> asyncWaiters = null; AsyncWaitHandle.AsyncWaiter item = null; if (!this.isSignaled) { lock (this.syncObject) { if (!this.isSignaled) { if (this.resetMode == EventResetMode.ManualReset) { this.isSignaled = true; Monitor.PulseAll(this.syncObject); asyncWaiters = this.asyncWaiters; this.asyncWaiters = null; } else if (this.asyncWaiters == null || this.asyncWaiters.Count <= 0) { this.isSignaled = true; } else { item = this.asyncWaiters[0]; this.asyncWaiters.RemoveAt(0); } } } } if (asyncWaiters != null) { foreach (AsyncWaitHandle.AsyncWaiter asyncWaiter in asyncWaiters) { asyncWaiter.CancelTimer(); asyncWaiter.Call(); } } if (item != null) { item.CancelTimer(); item.Call(); } }
private static void OnTimerComplete(object state) { AsyncWaitHandle.AsyncWaiter asyncWaiter = (AsyncWaitHandle.AsyncWaiter)state; AsyncWaitHandle parent = asyncWaiter.Parent; bool flag = false; lock (parent.syncObject) { if (parent.asyncWaiters != null && parent.asyncWaiters.Remove(asyncWaiter)) { asyncWaiter.TimedOut = true; flag = true; } } asyncWaiter.CancelTimer(); if (flag) { asyncWaiter.Call(); } }