gpt4 book ai didi

c# - System.Threading.Timer 和 49.7 天定时器翻转

转载 作者:行者123 更新时间:2023-11-30 22:48:46 35 4
gpt4 key购买 nike

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

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

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

谢谢。

最佳答案

Windows 系统时间翻转问题对 System.Threading.TimerSystem.Timers.Timer 没有影响(它只是 System.Timer 的包装器)。 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 , 以及相关函数。

关于c# - System.Threading.Timer 和 49.7 天定时器翻转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1509569/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com