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

C#定时器,每X秒触发一次,但与实时保持同步(即无漂移),c#,.net,timer,drift,C#,.net,Timer,Drift,C#中是否有一个.NET计时器可以确保事件之间没有“漂移”?也就是说,如果您将计时器设置为每X秒关闭一次,则在运行数天后,计时器不会漂移,即确保一天中X秒事件的接近数与它应该的值保持同步 如果没有,是否有一个众所周知的代码示例可以用C#包装一个计时器函数来实现这一点?我假设您已经尝试了一些东西,并且它会漂移 如果你想从一小时(5,10,15,20..)开始每隔5秒触发一次,你可以将计时器设置为触发一次,然后在回调中,将计时器重置为在DateTime触发。现在+秒数到下一个5秒间隔 这将防止任何漂

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


如果没有,是否有一个众所周知的代码示例可以用C#包装一个计时器函数来实现这一点?

我假设您已经尝试了一些东西,并且它会漂移

如果你想从一小时(5,10,15,20..)开始每隔5秒触发一次,你可以将计时器设置为触发一次,然后在回调中,将计时器重置为在DateTime触发。现在+秒数到下一个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();
}

很抱歉,只给你一个链接,但这是一个完全合格的,企业,测试。。。图书馆。。。你不需要重新发明轮子:)

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


但是:用quartz.net做
Console.WriteLine(…)
太过分了…:)

听起来不错-我想我在想,在.NET框架中是否还没有一个函数可以做到这一点,它会给一个小的WPF应用程序Andreas增加很多开销?i、 e.超越米凯尔给出的方法?(也就是说,在多大程度上使用大锤来敲开螺母?+1不知道这个库,但我一定会记住它。