具有定时操作的可重新启动任务



我在清理网络同步对象时遇到问题:每次勾选时,服务器都会向客户端(不可靠(发送该玩家周围对象的状态(位置、四元数(。

为了提高客户端的性能,我希望清理(隐藏或处置(X时间内未更新的对象。

我想出了以下想法:

实现类似于JavaScript的setTimeout的机制。该机制应该支持运行中期终止以及使用相同的参数集重新启动。

我想创建一个class,它实现Task并接受ushort作为超时间隔,并在时间过去后执行Action/Function。

我将把上面的类称为TimedTask

TimedTask将具有2个内部线程/任务:1.thread/task1将负责睡眠,直到超时2.thread/task2将负责接收中期运行命令(例如,重新启动、停止、终止(

TimedTask可以存活很长时间,这取决于环境,并且可能有20-100个以上的TimedTask并行运行。

我担心上面的实现会导致重大的性能问题,而且可能有更好的方法来解决这个问题,我是否应该在每个勾选时循环查看我的客户端拥有的每个网络对象,看看哪些没有更新?

如果你们有任何建议,我将不胜感激。

看一看Stephen Toub的PauseTokenSource类(也可在StephenCleary的AsyncEx.Communication包中获得(。您可能有数百个长寿命任务,每个任务都由一个单独的PauseTokenSource控制。性能将取决于你在每项任务中所做的事情。暂停机制的开销应该可以忽略不计,除非你预计每秒大约100000个循环或更多(对于所有任务(。

using Nito.AsyncEx;
async Task CreateLongLivedTask(PauseToken pauseToken, CancellationToken cancellationToken)
{
while (true)
{
await pauseToken.WaitWhilePausedAsync(cancellationToken);
DoImportantStuff();
await Task.Delay(100, cancellationToken); // 10 loops per second
}
}

最新更新