59

我知道这会Thread.Sleep阻塞一个线程。

Task.Delay也会阻塞吗?还是就像Timer使用一个线程处理所有回调(不重叠时)一样?

这个问题不包括差异)

4

1 回答 1

57

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;
}

基本上,这个方法只是一个包裹在任务中的计时器。所以是的,你可以说它就像计时器。

于 2013-06-23T08:09:32.453 回答