【问题标题】:Getting a system-clock-change-tick in C#在 C# 中获取系统时钟更改滴答声
【发布时间】:2009-09-16 16:17:00
【问题描述】:

当系统时钟中的秒、分、小时……发生变化时,他们是否可以在 C# 中执行 delegate 或 event,而不使用每毫秒检查属性是否已更改的计时器并以最大一毫秒的延迟执行事件。

因此我想避免轮询并在特定时间触发一个事件。

【问题讨论】:

  • 你的问题有点不清楚你想要的分辨率。
  • 这正是我所需要的,这是一个明确的问题,我现在需要一个明确的答案!是的,宝贝!使用计时器是大材小用。

标签: c# events delegates clock


【解决方案1】:

如果您的问题是:“如何每整秒/分钟/小时执行一次委托?”

对于分钟和小时间隔,您可以执行我在此 SO 问题中的回答中所示的操作:

这应该是相当准确的,但不会精确到毫秒。

对于第二个间隔,我会使用一个简单的 1 秒间隔的计时器。从用户的角度来看,我认为如果操作在 xx:xx:xx.000 或 xx:xx:xx.350 执行,差别不大。

【讨论】:

  • dtb 总体上是非常正确的,但是使用这种间隔为 1 秒的方法,一个细节可能看起来有点尴尬 - 可能会发生应用程序开始计数,比如每分钟 950 毫秒。与应用程序同时查看系统时钟显示切换到下一秒的显着延迟。为了解决这个问题,我会使用更小的计时器间隔,例如100-250ms,取决于特定的使用情况。
【解决方案2】:

您可以订阅SystemEvents.TimeChanged。当系统时钟改变时触发。

【讨论】:

  • 根据文档,仅当用户更改系统时间时才会触发。这可能不是 CommuSoft 想要的。好吧,或者是,如果他想找出用户何时篡改时间,作为软件保护功能......
【解决方案3】:

我通过将时间间隔设置为 (1000 - DateTime.Now.Millisecond) 在表单应用程序中解决了这个问题

        _timer1 = new System.Windows.Forms.Timer();
        _timer1.Interval = (1000 - DateTime.Now.Millisecond);
        _timer1.Enabled = true;
        _timer1.Tick += new EventHandler(updateDisplayedTime);

并在事件处理程序中重置间隔以防止漂移。

        <handle event>
        _timer1.Interval = (1000 - DateTime.Now.Millisecond);

【讨论】:

    猜你喜欢
    • 2021-04-14
    • 2011-02-13
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多