当前位置: 首页 > 编程语言 > C#

C#LearningTutorial-C#TimerFiredBeforeInterval分享

时间:2023-04-10 20:12:13 C#

C#TimerBeforeInterval在使用System.Threading.Timer(.NET2.0)从Windows服务中,我们遇到了以下问题。大约有12个不同的计时器对象。每个计时器都有适当的时间和间隔。这是正确设置的。据观察,在3到4小时后,定时器在它们的间隔结束之前开始发出信号。例如,如果定时器应该在4:59:59发出信号,它会在7秒前的4:59:52发出信号。有人可以告诉我这种行为的原因是什么以及解决方案是什么?谢谢,Swati很好的问题...原因如下:“时间”对于计算机来说是一件棘手的事情...您永远不能依赖“间隔”来做到完美。有些计算机只会每14到15毫秒“滴答”一次计时器,有些比这更频繁,有些则更少。所以:Thread.Sleep(1);可能需要1到30毫秒才能运行。相反,如果您需要一个更精确的计时器-您必须在开始时捕获DateTime,然后在您的计时器中您必须通过减去DateTime.Now和您的原始编码时间来检查它是否是“运行时间”。下面是您需要执行的一些示例代码:DateTimestartDate=DateTime.Now;然后,以1毫秒的间隔启动计时器。然后,在您的方法中:if(DateTime.Now.Subtract(startDate).TotalSeconds%3==0){//此代码将每3秒触发一次。上面的代码将忠实地每3秒触发一次。你可以让它运行10年,它仍然会每3秒启动一次。蒂莫西的解释很有说服力,但System.Threading.Timer已经以这种方式工作。至少在Rotor实现中,它使用GetTickCount()返回的值来计算下一次回调到期的时间。真正的CLR也不太可能这样做,更有可能使用CreateTimerQueueTimer()。但是,此API函数也可能依赖于由时钟节拍中断增加的内部节拍。问题在于内部时钟滴答(由GetTickCount()和Environment.TickCount返回)与绝对挂起时间(由DateTime.Now返回)保持同步。不幸的是,这是您机器上硬件抽象层的HAL的实现细节。机器制造商可以提供经过调整以与机器的BIOS和芯片组配合使用的自定义HAL。如果机器有两个计时源,一个时钟芯片设计用于跟踪挂钟时间,即使你拔下机器电源也会保持滴答作响,芯片组上的另一个可用频率可用于提供时钟中断。最初的IBMATPC就是这样工作的。时钟芯片通常是可以信任的,如果不准确时钟将严重关闭。芯片组不能,降低振荡器质量是省钱的简单方法。通过避免计时器上的长时间并在回调中从DateTime.Now重新计算下一个过期时间来解决您的问题。也许重新安排是在需要几秒钟才能完成的操作之后完成的。或者你不控制这个?这无法控制,因为它取决于系统的速度,如果你有一台超级计算机,那么可能没有足够的差异,但如果你有一台普通的PC,那么在长时间执行后定时器间隔会有差异。希望有所帮助。以上就是C#学习教程的全部内容:C#定时器在间隔时间之前触发。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: