使用Task.Delay()的成本是多少?

我正在考虑在具有事件驱动逻辑的MMO游戏服务器中使用C#async \ await。 让我们假设有数千个实体在已知持续时间内完成一些工作。 所以我想为每个游戏对象调用Time.Delay() 。 (这是对每个游戏对象进行一些Update()调用的常见无限循环的对立方法。)

有谁知道Task.Delay()是如何实现的? 它是否使用计时器? 系统资源是否很重?

是否可以产生数千个同时Task.Delay()调用?

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) (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 { 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(); } } 

它确实使用了计时器,但对我来说似乎并不担心。 计时器只是回调完整的方法,它的作用是检查它是否被取消,如果取消它,否则只返回一个结果。 对我来说似乎很好。