C# 中是否有可用的 .NET Timer 可以确保事件之间没有“漂移”?也就是说,如果您将计时器设置为每 X 秒关闭一次,那么在运行数天后它不会漂移,即确保一天中接近 X 秒事件的数量与应有的数量保持同步?
如果没有,是否有一个众所周知的代码示例可以在 C# 中包装一个 Timer 函数来执行此操作?
我假设您已经尝试过某些东西,并且它会漂移。
如果您想从一小时(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();
}
抱歉只给你一个到quartz.net的链接,但这是一个完全合格的、企业级的、经过测试的……图书馆……你不需要重新发明轮子:)
如果您担心开销,您对开销的定义是什么?是文件大小(二进制文件大约为 0.5mb)还是逻辑开销。逻辑部分很好:我认为实现他们的IJob
-interface 可以很好地强制消费者编写更好的代码。我不是内联方法的大朋友(仅作为一个例子,因为你可能会在计时器结束时触发他们的指针) - 类会给你更多的可能性,并且再次强制更好的 oop,域设计,.. .
但是:Console.WriteLine(...)
使用quartz.net 将是矫枉过正...... :)