public DispatcherOperationStatus Wait(TimeSpan timeout) { if ((_status == DispatcherOperationStatus.Pending || _status == DispatcherOperationStatus.Executing) && timeout.TotalMilliseconds != 0) { if (_dispatcher.Thread == Thread.CurrentThread) { if (_status == DispatcherOperationStatus.Executing) { // We are the dispatching thread, and the current operation state is // executing, which means that the operation is in the middle of // executing (on this thread) and is trying to wait for the execution // to complete. Unfortunately, the thread will now deadlock, so // we throw an exception instead. throw new InvalidOperationException(SR.Get(SRID.ThreadMayNotWaitOnOperationsAlreadyExecutingOnTheSameThread)); } // We are the dispatching thread for this operation, so // we can't block. We will push a frame instead. DispatcherOperationFrame frame = new DispatcherOperationFrame(this, timeout); Dispatcher.PushFrame(frame); } else { // We are some external thread, so we can just block. Of // course this means that the Dispatcher (queue)for this // thread (if any) is now blocked. The COM STA model // suggests that we should pump certain messages so that // back-communication can happen. Underneath us, the CLR // will pump the STA apartment for us, and we will allow // the UI thread for a context to call // Invoke(Priority.Max, ...) without going through the // blocked queue. DispatcherOperationEvent wait = new DispatcherOperationEvent(this, timeout); wait.WaitOne(); } } if (_useAsyncSemantics) { if (_status == DispatcherOperationStatus.Completed || _status == DispatcherOperationStatus.Aborted) { // We know the operation has completed, so it safe to ask // the task for the Awaiter, and the awaiter for the result. // We don't actually care about the result, but this gives the // Task the chance to throw any captured exceptions. Task.GetAwaiter().GetResult(); } } return(_status); }
/// <summary> /// Waits for this operation to complete. /// </summary> /// <param name="timeout"> /// The maximum amount of time to wait. /// </param> /// <returns> /// The status of the operation. To obtain the return value /// of the invoked delegate, use the the Result property. /// </returns> public DispatcherOperationStatus Wait(TimeSpan timeout) { if ((_status == DispatcherOperationStatus.Pending || _status == DispatcherOperationStatus.Executing) && timeout.Ticks != 0) { if (_dispatcher.Thread == Thread.CurrentThread) { if (_status == DispatcherOperationStatus.Executing) { // We are the dispatching thread, and the current operation state is // executing, which means that the operation is in the middle of // executing (on this thread) and is trying to wait for the execution // to complete. Unfortunately, the thread will now deadlock, so // we throw an exception instead. throw new InvalidOperationException(); } // We are the dispatching thread for this operation, so // we can't block. We will push a frame instead. DispatcherOperationFrame frame = new DispatcherOperationFrame(this, timeout); Dispatcher.PushFrame(frame); } else { // We are some external thread, so we can just block. Of // course this means that the Dispatcher (queue)for this // thread (if any) is now blocked. // Because we have a single dispatcher per app domain, this thread // must be from another app domain. We will enforce semantics on // dispatching between app domains so we don't lock up the system. DispatcherOperationEvent wait = new DispatcherOperationEvent(this, timeout); wait.WaitOne(); } } return(_status); }
public DispatcherOperationStatus Wait(TimeSpan timeout) { if((_status == DispatcherOperationStatus.Pending || _status == DispatcherOperationStatus.Executing) && timeout.TotalMilliseconds != 0) { if(_dispatcher.Thread == Thread.CurrentThread) { if(_status == DispatcherOperationStatus.Executing) { // We are the dispatching thread, and the current operation state is // executing, which means that the operation is in the middle of // executing (on this thread) and is trying to wait for the execution // to complete. Unfortunately, the thread will now deadlock, so // we throw an exception instead. throw new InvalidOperationException(SR.Get(SRID.ThreadMayNotWaitOnOperationsAlreadyExecutingOnTheSameThread)); } // We are the dispatching thread for this operation, so // we can't block. We will push a frame instead. DispatcherOperationFrame frame = new DispatcherOperationFrame(this, timeout); Dispatcher.PushFrame(frame); } else { // We are some external thread, so we can just block. Of // course this means that the Dispatcher (queue)for this // thread (if any) is now blocked. The COM STA model // suggests that we should pump certain messages so that // back-communication can happen. Underneath us, the CLR // will pump the STA apartment for us, and we will allow // the UI thread for a context to call // Invoke(Priority.Max, ...) without going through the // blocked queue. DispatcherOperationEvent wait = new DispatcherOperationEvent(this, timeout); wait.WaitOne(); } } if(_useAsyncSemantics) { if(_status == DispatcherOperationStatus.Completed || _status == DispatcherOperationStatus.Aborted) { // We know the operation has completed, so it safe to ask // the task for the Awaiter, and the awaiter for the result. // We don't actually care about the result, but this gives the // Task the chance to throw any captured exceptions. Task.GetAwaiter().GetResult(); } } return _status; }
/// <summary> /// Waits for this operation to complete. /// </summary> /// <param name="timeout"> /// The maximum amount of time to wait. /// </param> /// <returns> /// The status of the operation. To obtain the return value /// of the invoked delegate, use the the Result property. /// </returns> public DispatcherOperationStatus Wait(TimeSpan timeout) { if ((_status == DispatcherOperationStatus.Pending || _status == DispatcherOperationStatus.Executing) && timeout.Ticks != 0) { if (_dispatcher.Thread == Thread.CurrentThread) { if (_status == DispatcherOperationStatus.Executing) { // We are the dispatching thread, and the current operation state is // executing, which means that the operation is in the middle of // executing (on this thread) and is trying to wait for the execution // to complete. Unfortunately, the thread will now deadlock, so // we throw an exception instead. throw new InvalidOperationException(); } // We are the dispatching thread for this operation, so // we can't block. We will push a frame instead. DispatcherOperationFrame frame = new DispatcherOperationFrame(this, timeout); Dispatcher.PushFrame(frame); } else { // We are some external thread, so we can just block. Of // course this means that the Dispatcher (queue)for this // thread (if any) is now blocked. // Because we have a single dispatcher per app domain, this thread // must be from another app domain. We will enforce semantics on // dispatching between app domains so we don't lock up the system. DispatcherOperationEvent wait = new DispatcherOperationEvent(this, timeout); wait.WaitOne(); } } return _status; }