我正在开发一个应该不断运行的C#Mono应用程序。它的程序有几个并行运行但不停止的任务。
为此,我正在使用.NET Task类。
每个任务一旦启动,就会运行一个无限循环并在此循环中执行其任务。由于我使用的几乎所有任务都不需要每毫秒工作,但每5-10秒,我在每个无限循环的末尾放置一个Thread.Sleep()
。
我的内部任务运行序列如下所示:
while (Running)
{
//Do the job
Thread.Sleep(5000);
}
它实际上工作正常,因为我不介意在任务醒来并重复其工作时具有高精度。我还需要“减慢”每个任务的速度,以避免浪费CPU(我的目标机器非常低)。
问题是,如果操作系统时间因任何原因而改变(特别是,如果它返回)所有我的Thread.Sleep
调用都会冻结,如果我将时钟设置回原始时间一切都开始工作了。我认为这是由于这种调用的内部工作,但这实际上迫使我重新启动整个程序。
我甚至尝试用Timer
(始终来自.NET Framework)替换无限循环,但我遇到了同样的问题:更改操作系统时钟会导致我的计时器停止触发。
我该如何处理这个问题?当然,机器时钟可能会改变,我甚至有一个NTP客户端可以随时更改它。