网上有很多关于如何在应用程序中显示当前时间的解决方案。有定时器和异步的解决方案。
但我发现的所有解决方案都存在一个问题——它们导致界面并非每秒更新一次。
- 跳过几秒钟。对于那些将更新间隔设置为 1000 毫秒的人,调用发生的频率较低,因为计时器从上一个处理程序执行结束到下一个处理程序执行倒计时一秒。而不是每秒调用一次。当它到达改变秒值的边界时,时钟会变慢,跳过一秒,例如
10:33:12 => 10:33:14。 - 轮询。有更智能的解决方案,它们不是每秒更新一次屏幕上的时间,而是每秒更新 5 次甚至更多次。更新越频繁,屏幕上的时间就越相关。当从每秒更新 10 次及以上时,延迟结果是最大正负更新间隔,即每秒更新 10 次,秒数变化的间隔将从 0.9 秒到 1.1 秒,原则上,肉眼几乎察觉不到。但这是另一个负值 - 频繁的界面更新 + 频繁的系统时间请求会给系统带来额外的负载。
看起来任务看似简单,但我没有找到现成的解决方案,或者我看起来很糟糕。我决定自己写。
开发解决方案的要求如下:
这是解决方案:
在这里,我用一块石头杀死了 2 只鸟:我每秒只调用一次更新,并且
.001-.020мс在时钟上的秒数变化之后立即发生更新,并且我立即将已经从系统收到的日期传输给代表。实际偏差仅由异步成本产生。我像这样在WPF中目视检查
与更新托盘中的Windows系统时钟
Text绑定并比较的属性在哪里。TextBlock分钟在同一时间更改,甚至在应用程序中更早更改。为了工作清晰,我还在控制台中对其进行了测试
控制台输出
如您所见,在启动后立即发生稳定,然后调用恰好每秒一次,尽可能接近时钟上的秒数变化。
在系统延迟、CPU 过载或死机时,会尽快调用委托,然后像初始启动时一样再次稳定,这符合条件。即使您坚持使用委托本身,例如
Thread.Sleep(500)暂停线程,调用仍将是每秒 1 次,尽管从时钟秒数变化的那一刻起延迟相同的 500 毫秒。