C#,System.Timers.Timer,每隔一分钟与系统时钟同步运行

时间:2012-06-13 11:38:41

标签: c# timer system sync clock

我试图让每个分钟的计时器与系统时钟同步(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);
}

4 个答案:

答案 0 :(得分:4)

不会。

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

答案 1 :(得分:0)

我看不到它是如何徘徊的,每次计时器滴答时,它都会确定它到下一分钟的时间长度并相应地设置间隔。理论上它实际上非常巧妙,因为我自己定时器会徘徊。当然,唯一可以确定的方法就是对它进行测试,因此只要你的用户界面不会冻结超过60秒(可能50秒安全),就不会出现问题。请记住,笔记本电脑在离开一段时间后经常会进入睡眠状态,或者盖子关闭,这会导致故障。

根据您正在尝试做的事情,为什么不使用系统时间,每次分钟更改时发送一个事件?

答案 2 :(得分:0)

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

我可以通过此代码看到的唯一潜在问题是,如果ThreadPool处于如此紧张的状态,以致您的计时器回调未在一分钟间隔内出列并执行,从而导致跳过分钟。

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

答案 3 :(得分:0)

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

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