Thread.Sleep vs Task.Delay?

Я знаю, что Thread.Sleep блокирует поток.

Но также блокирует ли Task.Delay? Или это похоже на Timer, который использует один поток для всех обратных вызовов (если не перекрывается)?

( этот вопрос не охватывает различия)

Ответ 1

Документация по MSDN разочаровывает, но декомпиляция Task.Delay с использованием Reflector дает дополнительную информацию:

public static Task Delay(int millisecondsDelay, CancellationToken cancellationToken)
{
    if (millisecondsDelay < -1)
    {
        throw new ArgumentOutOfRangeException("millisecondsDelay", Environment.GetResourceString("Task_Delay_InvalidMillisecondsDelay"));
    }
    if (cancellationToken.IsCancellationRequested)
    {
        return FromCancellation(cancellationToken);
    }
    if (millisecondsDelay == 0)
    {
        return CompletedTask;
    }
    DelayPromise state = new DelayPromise(cancellationToken);
    if (cancellationToken.CanBeCanceled)
    {
        state.Registration = cancellationToken.InternalRegisterWithoutEC(delegate (object state) {
            ((DelayPromise) state).Complete();
        }, state);
    }
    if (millisecondsDelay != -1)
    {
        state.Timer = new Timer(delegate (object state) {
            ((DelayPromise) state).Complete();
        }, state, millisecondsDelay, -1);
        state.Timer.KeepRootedWhileScheduled();
    }
    return state;
}

В принципе, этот метод - это всего лишь таймер, завернутый внутри задачи. Так что да, вы можете сказать это точно так же, как таймер.