Ejemplo n.º 1
0
		public bool Wait (int millisecondsTimeout, CancellationToken cancellationToken)
		{
			if (millisecondsTimeout < -1)
				throw new ArgumentOutOfRangeException ("millisecondsTimeout");

			bool result = true;

			if (!IsCompleted) {
				// If the task is ready to be run and we were supposed to wait on it indefinitely without cancellation, just run it
				if (Status == TaskStatus.WaitingToRun && millisecondsTimeout == Timeout.Infinite && scheduler != null && !cancellationToken.CanBeCanceled)
					scheduler.RunInline (this, true);

				if (!IsCompleted) {
					var continuation = new ManualResetContinuation ();
					try {
						ContinueWith (continuation);
						result = continuation.Event.Wait (millisecondsTimeout, cancellationToken);
					} finally {
						if (!result)
							RemoveContinuation (continuation);
						continuation.Dispose ();
					}
				}
			}

			if (IsCanceled)
				throw new AggregateException (new TaskCanceledException (this));

			var exception = Exception;
			if (exception != null)
				throw exception;

			return result;
		}
Ejemplo n.º 2
0
        public void RunSynchronously(TaskScheduler scheduler)
        {
            if (scheduler == null)
            {
                throw new ArgumentNullException("scheduler");
            }

            if (Status > TaskStatus.WaitingForActivation)
            {
                throw new InvalidOperationException("The task is not in a valid state to be started");
            }

            SetupScheduler(scheduler);
            var saveStatus = status;

            Status = TaskStatus.WaitingToRun;

            try {
                if (scheduler.RunInline(this))
                {
                    return;
                }
            } catch (Exception inner) {
                throw new TaskSchedulerException(inner);
            }

            Status = saveStatus;
            Start(scheduler);
            Wait();
        }
Ejemplo n.º 3
0
		internal void RunSynchronouslyCore (TaskScheduler scheduler)
		{
			SetupScheduler (scheduler);
			var saveStatus = status;
			Status = TaskStatus.WaitingToRun;

			try {
				if (scheduler.RunInline (this, false))
					return;
			} catch (Exception inner) {
				throw new TaskSchedulerException (inner);
			}

			Status = saveStatus;
			Start (scheduler);
			Wait ();
		}
Ejemplo n.º 4
0
        public void RunSynchronously(TaskScheduler scheduler)
        {
            if (Status > TaskStatus.WaitingForActivation)
            {
                throw new InvalidOperationException("The task is not in a valid state to be started");
            }

            SetupScheduler(scheduler);
            status = TaskStatus.WaitingToRun;

            if (scheduler.RunInline(this))
            {
                return;
            }

            Start(scheduler);
            Wait();
        }
Ejemplo n.º 5
0
        internal bool WaitCore(int millisecondsTimeout, CancellationToken cancellationToken)
        {
            if (IsCompleted)
            {
                return(true);
            }

            // If the task is ready to be run and we were supposed to wait on it indefinitely without cancellation, just run it
            if (Status == TaskStatus.WaitingToRun && millisecondsTimeout == Timeout.Infinite && scheduler != null && !cancellationToken.CanBeCanceled)
            {
                scheduler.RunInline(this, true);
            }

            bool result = true;

            if (!IsCompleted)
            {
                var continuation = new ManualResetContinuation();
                try
                {
                    ContinueWith(continuation);

                    result = continuation.Wait(millisecondsTimeout, cancellationToken);
                }
                finally
                {
                    if (!result)
                    {
                        RemoveContinuation(continuation);
                    }
                    continuation.Dispose();
                }
            }

            return(result);
        }