我在考虑在事件驱动逻辑中的MMO游戏服务器中使用C#async \ await。假设有数千个实体正在执行一些已知持续时间的工作。因此,我想为我的每个游戏对象调用 Time.Delay()
。 (这是与每个游戏对象某些 Update()
调用的常见无限循环相反的方法。)
有人知道 Task.Delay()
如何实现吗?
它是否使用计时器? 它对系统资源的负担重吗?
同时产生数千个 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<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();
}
}
它确实使用了一个定时器,但对我来说似乎不是什么值得担心的事情。定时器只是回调到完成方法,它所做的就是检查它是否被取消了,如果是则取消它,否则返回结果。在我看来这很好。
System.Timers.Timer
实现。而且我是根据多年前查阅的记忆在说,可能有错。 - Stephen ClearyTask.Delay
是通过 TimerQueue
实现的。它不会每次都创建一个新的 Timer
。从我所看到的 source code,它实际上创建了 N 个“队列”,其中 N 是 CPU 核心数。然后为每个队列使用 1 个计时器。Task.Delay
都是如此。我希望有更好的方式。
Thread.Sleep
不是异步的? - It'sNotALie.Task.Delay()
的代码似乎立即返回,并且在延迟结束后,延迟后面的代码将恢复执行。只要调用它的方法本身是async
的,它就是非阻塞的。 - Matthew WatsonThread.Sleep
时传入0或1以外的参数总是一个很大的设计问题。 - Alex Zhukovskiy