public XEvent DequeueUnlocked (out bool paint) { paint = false; try_again: XEvent xev = xqueue.Dequeue (); if (xev != null) return xev; xev = paint_queue.Dequeue (); if (xev != null) { paint = true; return xev; } // both queues are empty. go to sleep until NextTimeout // (or until there's an event to handle). if (Monitor.Wait (xqueue, NextTimeout (DateTime.UtcNow), true)) { /* the lock was reaquired before timeout. i.e. we have an event now */ goto try_again; } else return null; }