Task.Delay
wird wie folgt implementiert:
public static Task Delay(int millisecondsDelay, CancellationToken cancellationToken)
{
//error checking
Task.DelayPromise delayPromise = new Task.DelayPromise(cancellationToken);
if (cancellationToken.CanBeCanceled)
delayPromise.Registration = cancellationToken.InternalRegisterWithoutEC((Action<object>) (state => ((Task.DelayPromise) state).Complete()), (object) delayPromise);
if (millisecondsDelay != -1)
{
delayPromise.Timer = new Timer((TimerCallback) (state => ((Task.DelayPromise) state).Complete()), (object) delayPromise, millisecondsDelay, -1);
delayPromise.Timer.KeepRootedWhileScheduled();
}
return (Task) delayPromise;
}
Es nutzt definitiv Timer. Sie werden in einer Klasse namens DelayPromise
verwendet. Hier ist die Implementierung dafür:
private sealed class DelayPromise : Task<VoidTaskResult>
{
internal readonly CancellationToken Token;
internal CancellationTokenRegistration Registration;
internal Timer Timer;
internal DelayPromise(CancellationToken token)
{
this.Token = token;
}
internal void Complete()
{
if (!(this.Token.IsCancellationRequested ? this.TrySetCanceled(this.Token) : this.TrySetResult(new VoidTaskResult())))
return;
if (this.Timer != null)
this.Timer.Dispose();
this.Registration.Dispose();
}
}
Es verwendet einen Timer, aber es scheint nicht wie eine Sorge für mich. Der Timer ruft nur die vollständige Methode auf und überprüft, ob sie abgebrochen wurde. Wenn sie abgebrochen wird, geben Sie einfach ein Ergebnis zurück. Es scheint mir gut zu sein.
@ColeJohnson Weil 'Thread.Sleep' nicht' async' ist? –
Und Task.Delay ist? Das ergibt keinen Sinn. Wenn ich einen Thread verzögern möchte, möchte ich es JETZT, keinen anderen Thread hervorbringen, um einen anzuhalten. –
@Cole Der Punkt ist, einen Thread einige Zeit warten zu lassen, bevor er fortfährt. Es geht nicht darum, einen Thread zu verzögern. –