我正在用c#中的DispatchTimer编写一个时钟应用程序,但由于某些原因,我的时钟似乎偶尔跳过1秒。
例如。 52s - > 54s跳过53s。
在我看来,计时器并不是每一秒都执行一次。
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += DispatcherTimerEventHandler;
timer.Interval = new TimeSpan(0, 0, 0, 0, 1000);
或
timer.Interval = new TimeSpan(0, 0, 0, 1);
两者都不起作用。
答案 0 :(得分:2)
来自documentation of the DispatchTimer(强调我的):
无法保证计时器在时间间隔内完全执行 发生,但保证它们不会在时间之前执行 间隔发生。这是因为放置了DispatcherTimer操作 与其他操作一样在Dispatcher队列中。当。。。的时候 DispatcherTimer操作的执行依赖于其他作业 队列及其优先级。
通常我会建议使用某种调度/ cron框架,比如Quartz.NET,但这对你的用例来说似乎是一个巨大的开销。
对于“时钟应用程序”,虽然很难知道你想要做什么,但我会选择自己的解决方案 - 这意味着某种带有while循环或BackgroundWorker的新线程。
即使是timer也可以为您提供帮助,例如in this answer。
答案 1 :(得分:0)
基本上你的做法是错误的。不要添加"一秒钟"基于任何类型的计时器的TimeSpan(或任何类型的计数器),因为在Windows中,计时器不能保证以确切的间隔触发。使用这种方法将导致漂移"在更长的时间内。
相反,存储一个DateTime" start"从当前DateTime中减去该值并得到一个TimeSpan,表示自" start"以来已经发生了多长时间。通过这种方法,您更新时钟的频率并不重要。您可以每秒更新10次,或每分钟更新一次,返回的TimeSpan仍然是正确的。
另一种方法是使用秒表类。它通过从其Elapsed()属性返回TimeSpan来封装上述过程。
使用上述两种方法中的任何一种方法,定时器触发的频率并不重要,因为它将保持与定时器频率/定时无关的准确时间。