public static bool WaitAny(Event[] events, int millisecs) { if (events.Length == 1) { return events[0].Wait(millisecs); } return ((WaitHandle.WaitTimeout == EventWaitHandle.WaitAny(toArray(events), millisecs, false)) ? false : true); }
public static bool WaitAny(Event[] events) { return WaitAny(events, Infinite); }
static bool waitAllInner(Event[] events, int millisecs) { if (events.Length == 1) { return events[0].Wait(millisecs); } return EventWaitHandle.WaitAll(toArray(events), millisecs, false); }
static bool waitAllMulti(Event[] events, int millisecs) { int numBlocks = (events.Length + 63) / 64; List<Event>[] list = new List<Event>[numBlocks]; int i; for (i = 0; i < numBlocks; i++) { list[i] = new List<Event>(); } for (i = 0; i < events.Length; i++) { list[i / 64].Add(events[i]); } double start = Time.NowDouble; double giveup = start + (double)millisecs / 1000.0; foreach (List<Event> o in list) { double now = Time.NowDouble; if (now <= giveup || millisecs < 0) { int waitmsecs; if (millisecs >= 0) { waitmsecs = (int)((giveup - now) * 1000.0); } else { waitmsecs = Timeout.Infinite; } bool ret = waitAllInner(o.ToArray(), waitmsecs); if (ret == false) { return false; } } else { return false; } } return true; }
public static bool WaitAll(Event[] events, int millisecs) { if (events.Length <= 64) { return waitAllInner(events, millisecs); } else { return waitAllMulti(events, millisecs); } }
static EventWaitHandle[] toArray(Event[] events) { List<EventWaitHandle> list = new List<EventWaitHandle>(); foreach (Event e in events) { list.Add(e.h); } return list.ToArray(); }