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);
 }
Пример #2
0
 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;
        }