protected bool WaitAny( WaitHandle[] events, out int occurredEventIndex, int timeout, IWaitController waitCtrl) { var eventsEx = new WaitHandle[events.Length + 1]; var disposeEventIndex = events.Length; events.CopyTo(eventsEx, 0); eventsEx[disposeEventIndex] = _disposeEvent; occurredEventIndex = waitCtrl == null ? WaitHandle.WaitAny(eventsEx, timeout) : waitCtrl.WaitAny(eventsEx, timeout); return occurredEventIndex != disposeEventIndex; }