7

C# 中是否有可用的 .NET Timer 可以确保事件之间没有“漂移”?也就是说,如果您将计时器设置为每 X 秒关闭一次,那么在运行数天后它不会漂移,即确保一天中接近 X 秒事件的数量与应有的数量保持同步?

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

4

2 回答 2

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();
}
于 2010-07-21T06:46:43.777 回答
6

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

如果您担心开销,您对开销的定义是什么?是文件大小(二进制文件大约为 0.5mb)还是逻辑开销。逻辑部分很好:我认为实现他们的IJob-interface 可以很好地强制消费者编写更好的代码。我不是内联方法的大朋友(仅作为一个例子,因为你可能会在计时器结束时触发他们的指针) - 类会给你更多的可能性,并且再次强制更好的 oop,域设计,.. .

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

于 2010-07-21T06:52:53.360 回答