System.Threading.Timer和49.7天计时器翻转

时间:2009-10-02 13:40:32

标签: c# .net timer

在运行很长时间的Windows服务中使用System.Threading.Timer是否安全?

换句话说,Windows Server 2003 32bit + .Net Framework 2.0中是否修复了49.7天的计时器翻转问题?

Thread.Sleep()是唯一的选择吗?

谢谢。

2 个答案:

答案 0 :(得分:2)

Windows系统时间翻转问题对System.Threading.TimerSystem.Timers.Timer(这只是System.Threading.Timer的包装)没有影响。

定时器间隔可以使用的最大值为int.MaxValue或2,147,483,648毫秒(24.86天)。但这只是您可以指定的最大单一间隔。这并不意味着您的计时器可以运行的最长时间为25天。也就是说,如果你的计时器设置为每30秒打一次,那么只要程序启动就会这样做。计时器不会在25天后失去理智而错过勾选。它也不会在49.7天之后失去理智。

原因是这些计时器甚至没有查看系统时间(Environment.TickCount)。他们是间隔计时器。

定时器和服务不能很好地结合在一起的想法是荒谬的。您不希望在服务中使用System.Windows.Forms.Timer,因为该计时器取决于是否存在消息循环。但System.Threading.TimerSystem.Timers.Timer在服务中的效果非常好。

如果您确实需要设置一个超过2 ^ 31毫秒的计时器间隔(即您希望程序每隔30天执行一次),则可以将一个托管包装器写入线程池计时器API。它允许您指定最多2 ^ 63 100纳秒“滴答”(约2 ^ 50毫秒,或接近30,000年)的计时器间隔。请参阅CreateThreadPoolTimer和相关功能。

答案 1 :(得分:1)

内部句点被声明为UInt32,其MaxValue为4,294,967,295,或者换句为49.7天...所以我不相信它会以正确的方式工作很长一段时间但是,如果我查看反射的代码,如果你每隔f.e销毁一次计时器就应该有效。 5天,然后创建一个新的。

修改:我认为,定时器和服务不能很好地协同工作,您可能需要阅读thisthis