我试图让每个分钟的计时器与系统时钟同步(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);
}
答案 0 :(得分:4)
不会。
DateTime.Now
使用系统时钟作为参考计时器,因此您的计时器始终与它保持同步,模数系统时钟分辨率的几毫秒。
答案 1 :(得分:0)
我看不到它是如何徘徊的,每次计时器滴答时,它都会确定它到下一分钟的时间长度并相应地设置间隔。理论上它实际上非常巧妙,因为我自己定时器会徘徊。当然,唯一可以确定的方法就是对它进行测试,因此只要你的用户界面不会冻结超过60秒(可能50秒安全),就不会出现问题。请记住,笔记本电脑在离开一段时间后经常会进入睡眠状态,或者盖子关闭,这会导致故障。
根据您正在尝试做的事情,为什么不使用系统时间,每次分钟更改时发送一个事件?
答案 2 :(得分:0)
你的代码不会漂移,但是(不可避免地)会出现抖动,因为定时器回调很少在请求的时间间隔内发生。
我可以通过此代码看到的唯一潜在问题是,如果ThreadPool
处于如此紧张的状态,以致您的计时器回调未在一分钟间隔内出列并执行,从而导致跳过分钟。
这似乎不太可能,但并不完全超出可能性范围。
答案 3 :(得分:0)
大图看起来很好,GetInterval
将始终返回正值,依此类推。我只看到一些警告:
60 - delay
秒,那么您将错过一次节拍