// TODO: Call directly if called from the same thread
        public override void Send(SendOrPostCallback d, System.Object state)
        {
            PendingSendOrPost ev = new PendingSendOrPost(d, state);

            lock (pendingEvents.SyncRoot)
            {
                pendingEvents.Enqueue(ev);
            }

            GLib.Idle.Add(ProcessEventsIdleHandler);

            ev.Wait();
        }
        // TODO: Call directly if called from the same thread
        public override void Send(SendOrPostCallback d, System.Object state)
        {
            PendingSendOrPost ev = new PendingSendOrPost(d, state);

            lock (pendingEvents.SyncRoot)
            {
                pendingEvents.Enqueue(ev);
            }

            GLib.Idle.Add(ProcessEventsIdleHandler);

            ev.Wait();
        }
        private bool ProcessEventsIdleHandler()
        {
            while (true)
            {
                PendingSendOrPost ev = null;

                lock (pendingEvents.SyncRoot)
                {
                    if (pendingEvents.Count == 0)
                    {
                        return(false);
                    }

                    ev = pendingEvents.Dequeue() as PendingSendOrPost;
                }

                ev.Invoke();
            }
        }