System.Threading.Timer是否依赖系统时间正确?

时间:2011-09-23 08:25:18

标签: c# .net

我有一个服务,它根据System.Threading.Timer每30分钟运行一次作业。定时器像往常一样设置间隔,并异步关闭作业。

昨晚,它所在服务器上的时间决定将自身重置为与实际时间完全不同的内容。日期。随后,我的工作没有每30分钟运行一次 - 事实上他们完全停止了。

然而,在今天早上重置时间后,下一个30分钟的任务自行运行(30分钟后),然后所有其他任务同时自行运行,好像他们整夜排队一样。

任何人都可以对此有所了解吗?

编辑:作为更新 - 使用其他计时器(System.Timers.Timer)并发生了完全相同的事情。时间变为完全不同的东西,服务然后停止完成其任务,直到早上重新设置时间,然后30分钟后它运行所有应该自更改时间以来每30分钟运行一次的任务!

4 个答案:

答案 0 :(得分:1)

我无法复制导致此问题的方案。

使用此代码

class Program
{
    private static Timer timer;
    private static readonly Stopwatch stopwatch = new Stopwatch();

    static void Main(string[] args)
    {
        timer = new Timer(Tick);
        stopwatch.Start();
        timer.Change(30000, Timeout.Infinite);
        Console.ReadLine();
    }

    private static void Tick(object obj)
    {
        stopwatch.Stop();
        Console.WriteLine(stopwatch.Elapsed.Seconds);
    }
}

我启动应用程序,将我的本地计算机时间更改为20秒。我启动应用程序后30秒仍然会调用Tick方法。秒表说30,我的手机定时器说30。

答案 1 :(得分:0)

我不知道这是怎么发生的,但我知道微软这样说:"For server-based timer functionality, you might consider using System.Timers.Timer"

答案 2 :(得分:0)

我认为这是因为Timer将回调队列用于线程池线程的执行,并且可能会将回调调度为将来的实际时间而不是间隔。

@ GertArnold的答案是正确的,你应该使用System.Timers.Timer,因为它会根据Interval属性的值来引发Elapsed事件。

答案 3 :(得分:0)

由于您尝试了所有与定时器相关的内置选项,因此只剩下以下选项:

  • 使用Sleep - 这是我认为不好的做法,但在你的具体情况下,应解决所描述的问题

  • 找到一些第三方计时器库,并用你相当特别的情节进行测试......