public override void Post(SendOrPostCallback d, object state) { // queue the item and don't wait for its execution. This is risky because // an unhandled exception will terminate the STA thread. Use with caution. SendOrPostCallbackItem item = new SendOrPostCallbackItem(d, state, ExecutionType.Post); mQueue.Enqueue(item); }
public void AddItem(SendOrPostCallbackItem item) { lock (((ICollection)mQueue).SyncRoot) { mQueue.Enqueue(item); mItemsInQueueEvent.Set(); } }
public override void Send(SendOrPostCallback d, object state) { // to avoid deadlock! if (Thread.CurrentThread.ManagedThreadId == _mainThreadId) { d(state); return; } // create an item for execution SendOrPostCallbackItem item = new SendOrPostCallbackItem(d, state, ExecutionType.Send); // queue the item mQueue.Enqueue(item); // wait for the item execution to end item.ExecutionCompleteWaitHandle.WaitOne(); // if there was an exception, throw it on the caller thread, not the // sta thread. if (item.ExecutedWithException) throw item.Exception; }