Task.Delay
jest realizowany w następujący sposób:
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;
}
pewno używa czasomierze. Są używane w klasie o nazwie DelayPromise
. Oto implementacja:
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();
}
}
Używa timera, ale nie wydaje mi się to martwić. Timer po prostu oddzwoni do kompletnej metody, a to, co robi, to sprawdzenie, czy jest anulowane, jeśli tak, to anuluj, w przeciwnym razie po prostu zwróć wynik. Wydaje mi się to w porządku.
@ColeJohnson Ponieważ 'Thread.Sleep' nie jest' async'? –
A Task.Delay to? To nie ma sensu. Jeśli chcę opóźnić wątek, chcę go TERAZ, nie odradzając kolejnego wątku, by powiedzieć, żeby się zatrzymał. –
@Cole Ważne jest, aby wątek poczekał chwilę przed wznowieniem. Chodzi o to, aby nie opóźniać wątku. –