Task.Delay
が実装されています。
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;
}
それは間違いなく、タイマーを使用しています。それらはDelayPromise
というクラスで使用されています。
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();
}
}
タイマーを使用していますが、私には心配していないようです。タイマーは完全なメソッドを呼び出すだけで、キャンセルされた場合はチェックし、キャンセルする場合はキャンセルします。それ以外の場合は結果を返します。それは私にとってはうまくいくようです。
@ColeJohnson 'Thread.Sleep'は' async'ではないので、 –
そしてTask.Delayは?それは意味をなさない。スレッドを遅延させたい場合は、今すぐ停止したいスレッドを生成しないようにします。 –
@Coleこれは、スレッドを再開するまでしばらく待つようにすることです。ポイントはスレッドを遅らせることではありません。 –