【问题标题】:C#, System.Timers.Timer, run every min in sync with system clockC#,System.Timers.Timer,每分钟运行一次,与系统时钟同步
【发布时间】:2012-06-13 11:38:40
【问题描述】:

我试图让计时器每分钟运行一次,与系统时钟(00:01:00、00:02:00、00:03:00 等)同步。下面的代码会产生一个稳定的计时器吗?我试过运行它。计时器确实每分钟精确运行一次。但问题是它会在几个月后开始消失吗?

private System.Timers.Timer timer;

public frmMain()
{
            timer = new System.Timers.Timer();
            timer.AutoReset = false;
            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Interval = GetInterval();
            timer.Start();
}

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
            //Do processing

            timer.Interval = GetInterval();
            timer.Start();

}
private double GetInterval()
{
            DateTime now = DateTime.Now;
            return ((60 - now.Second) * 1000 - now.Millisecond);
}

【问题讨论】:

标签: c# timer system sync clock


【解决方案1】:

不会的。

DateTime.Now 使用系统时钟作为参考计时器,因此您的计时器将始终与其保持同步,以系统时钟分辨率的几毫秒为模。

【讨论】:

    【解决方案2】:

    我看不出它是如何消失的,每次计时器滴答作响时,它都会确定到下一分钟的确切时间并相应地设置间隔。理论上它实际上是相当巧妙的,因为我自己的计时器会跑掉。当然,唯一可以确定的方法是对其进行测试,因此只要您的 UI 不冻结超过 60 秒(为了安全起见,可能需要 50 秒),就不会有问题。请记住,笔记本电脑通常会在放置一段时间后进入睡眠状态,或者盖上盖子,这会导致故障。

    但是,根据您尝试执行的操作,为什么不使用系统时间,在每分钟更改时发送事件?

    【讨论】:

      【解决方案3】:

      大图看起来不错,GetInterval 将始终返回正值,依此类推。我只看到一些警告:

      1. 如果发生待机/恢复,那么您可能会在非回合时间运行一次
      2. 如果 timer_Elapsed 需要超过一分钟才能完成,那么您将错过一个节拍
      3. 如果系统过载以至于 timer_Elapsed 计划延迟 40/50 秒并且 timer_Elapsed 花费的时间超过 60 - delay 秒,您将错过一个节拍

      【讨论】:

      • 这取决于您从不错过一分钟有多重要,您希望您的计划操作运行多少时间(最坏时间),以及您要完成什么
      • 正如比尔所说,解决方案取决于问题。如果您需要每天运行 1440 次(即每分钟一次),那么也许您应该跟踪它运行了多少次,而不是它应该运行了多少次。如果它是一个需要每分钟运行一次的计时器,那么everybeat检查它是否在最后一分钟运行,如果这次没有运行两次等等......
      • 如果它正在轮询更新,那么您可以完全忽略跳过的节拍等... [顺便说一句,我的真名不是 Bill xD]
      【解决方案4】:

      您的代码不会漂​​移,但会(不可避免地)出现抖动,因为 Timer 回调很少会在请求的时间间隔内触发。

      我可以在这段代码中看到的唯一潜在问题是ThreadPool 是否处于压力之下,以至于您的计时器回调没有出队并在一分钟间隔内执行,从而导致一分钟被跳过。

      这似乎不太可能,但并非完全超出可能性范围。

      【讨论】:

        猜你喜欢
        • 2012-06-09
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 2019-11-04
        • 2012-08-26
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        相关资源
        最近更新 更多