C#计时器每X秒触发一次,但与实时保持同步(即没有漂移)

Gre*_*reg 7 .net c# timer drift

C#中是否有可用的.NET Timer,可以确保事件之间没有"漂移"?也就是说,如果你设置定时熄灭每X秒,在操作就不会漂移天后,即确保X秒的事件,这种做法在数天保持同步与它应该是什么?

如果没有,是否有一个众所周知的代码示例将C#中的Timer函数包装起来执行此操作?

Mik*_*son 16

我假设你已经尝试了一些东西,它漂移了.

如果你想要从每小时(5,10,15,20 ..)开始每隔5秒发射一次,你可以将你的计时器设置为触发一次,然后在你的回调中,重置计时器以触发DateTime.Now +到下一个5秒间隔的秒数.

只要你的时钟是正确的,这就可以防止任何漂移.

像这样的东西

System.Timers.Timer timer = new Timer();

void Init()
{
    timer.Elapsed += timer_Elapsed;
    int wait = 5 - (DateTime.Now.Second % 5);
    timer.Interval = wait*1000;
    timer.Start();
}


void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    timer.Stop();
    int wait = DateTime.Now.Second % 5;
    timer.Interval = wait * 1000;
    timer.Start();
}
Run Code Online (Sandbox Code Playgroud)


And*_*air 6

抱歉只给你一个链接到quartz.net,但这是一个完全合格的企业,经过测试的...库......你不需要重新发明轮子:)

如果你担心开销,你对开销的定义是什么?是文件大小(二进制文件大约是0.5mb)还是逻辑中的开销.逻辑部分:我认为实现他们IJob的接口可以很好地强制推出更好的消费者代码.我不是内联方法的大朋友(就像一个例子,因为你可能会在计时器过去时发出指针) - 类会给你更多的可能性,再一次,强迫更好的oop,域设计,... .

但是:Console.WriteLine(...)使用quartz.net会有点矫枉过正...... :)