public bool Wait(int milliseconds, CancellationToken cancellationToken) { if (milliseconds < -1) { throw new ArgumentOutOfRangeException(nameof(milliseconds)); } if (milliseconds == -1) { Wait(cancellationToken); return(true); } var start = ThreadingHelper.TicksNow(); do { CancellationCheck(cancellationToken); switch (Status) { case TaskStatus.WaitingForActivation: WaitAntecedent(cancellationToken, milliseconds, start); ExecutingTaskScheduler.InternalTryExecuteTaskInline(this, true); break; case TaskStatus.Created: case TaskStatus.WaitingToRun: case TaskStatus.Running: case TaskStatus.WaitingForChildrenToComplete: var waitHandle = _waitHandle.Value; waitHandle?.Wait ( TimeSpan.FromMilliseconds ( milliseconds - ThreadingHelper.Milliseconds(ThreadingHelper.TicksNow() - start) ), cancellationToken ); break; case TaskStatus.RanToCompletion: return(true); case TaskStatus.Canceled: ThrowIfExceptional(true); return(true); case TaskStatus.Faulted: ThrowIfExceptional(true); return(true); default: // Should not happen continue; } } while (ThreadingHelper.Milliseconds(ThreadingHelper.TicksNow() - start) < milliseconds); switch (Status) { case TaskStatus.RanToCompletion: return(true); case TaskStatus.Canceled: ThrowIfExceptional(true); return(true); case TaskStatus.Faulted: ThrowIfExceptional(true); return(true); default: return(false); } }