web-dev-qa-db-ja.com

Thread.Sleep vs Task.Delay?

そんなこと知ってる Thread.Sleepはスレッドをブロックします。

しかし、Task.Delayもブロック?それとも、すべてのコールバックに1つのスレッドを使用するTimerのようなものですか?

this 質問は違いをカバーしません)

55
Royi Namir

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

基本的に、このメソッドはタスク内にラップされた単なるタイマーです。そう、あなたはそれがタイマーのようだと言うことができます。

53
Kevin Gosse