Mono C#Thread在更改操作系统时间时冻结

时间:2017-04-20 16:53:52

标签: c# .net multithreading timer mono

我正在开发一个应该不断运行的C#Mono应用程序。它的程序有几个并行运行但不停止的任务。 为此,我正在使用.NET Task类。 每个任务一旦启动,就会运行一个无限循环并在此循环中执行其任务。由于我使用的几乎所有任务都不需要每毫秒工作,但每5-10秒,我在每个无限循环的末尾放置一个Thread.Sleep()。 我的内部任务运行序列如下所示:

while (Running)
{
   //Do the job
   Thread.Sleep(5000);
}

它实际上工作正常,因为我不介意在任务醒来并重复其工作时具有高精度。我还需要“减慢”每个任务的速度,以避免浪费CPU(我的目标机器非常低)。

问题是,如果操作系统时间因任何原因而改变(特别是,如果它返回)所有我的Thread.Sleep调用都会冻结,如果我将时钟设置回原始时间一切都开始工作了。我认为这是由于这种调用的内部工作,但这实际上迫使我重新启动整个程序。

我甚至尝试用Timer(始终来自.NET Framework)替换无限循环,但我遇到了同样的问题:更改操作系统时钟会导致我的计时器停止触发。

我该如何处理这个问题?当然,机器时钟可能会改变,我甚至有一个NTP客户端可以随时更改它。

0 个答案:

没有答案