public static bool WaitAll(this WaitHandle waitHandle, WaitHandle[] waitHandles, CancellationToken cancelToken) { bool ret = true; WaitHandle[] events = new WaitHandle[waitHandles.Length + 1]; Array.Copy(waitHandles, events, waitHandles.Length); events[waitHandles.Length] = cancelToken.WaitHandle; while (events.Length > 1) { WaitHandle firedEvent = events[WaitHandle.WaitAny(events)]; if (firedEvent != cancelToken.WaitHandle) { events = events.Where(e => e != firedEvent).ToArray(); } else { ret = false; break; } } return(ret); }