在运行很长时间的Windows服务中使用System.Threading.Timer是否安全?
换句话说,Windows Server 2003 32bit + .Net Framework 2.0中是否修复了49.7天的计时器翻转问题?
Thread.Sleep()是唯一的选择吗?
谢谢。
答案 0 :(得分:2)
Windows系统时间翻转问题对System.Threading.Timer
或System.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.Timer
和System.Timers.Timer
在服务中的效果非常好。
如果您确实需要设置一个超过2 ^ 31毫秒的计时器间隔(即您希望程序每隔30天执行一次),则可以将一个托管包装器写入线程池计时器API。它允许您指定最多2 ^ 63 100纳秒“滴答”(约2 ^ 50毫秒,或接近30,000年)的计时器间隔。请参阅CreateThreadPoolTimer和相关功能。
答案 1 :(得分:1)