gpt4 book ai didi

c# - 每分钟与系统时钟同步运行(不适用于 Windows Server 2003)

转载 作者:行者123 更新时间:2023-12-02 22:38:42 25 4
gpt4 key购买 nike

我正在尝试让计时器每分钟与系统时钟(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)
{

System.Diagnostics.Trace.WriteLine(DateTime.Now.ToString("hh:mm:ss tt"));
timer.Interval = GetInterval();
timer.Start();

}
private double GetInterval()
{
DateTime now = DateTime.Now;
return ((60 - now.Second) * 1000 - now.Millisecond);
}

它在我家用电脑上运行完美。

12:12:00 AM
12:13:00 AM
12:14:00 AM
12:15:00 AM
12:16:00 AM
12:17:00 AM
12:18:00 AM
12:19:00 AM
12:20:00 AM
12:21:00 AM

但是我在我的 VPS (windows server 2003) 上得到了奇怪的结果。

12:11:59 AM
12:12:59 AM
12:13:00 AM
12:13:59 AM
12:14:00 AM
12:14:59 AM
12:15:00 AM
12:15:59 AM
12:16:00 AM
12:16:59 AM
12:17:00 AM
12:17:59 AM
12:18:00 AM
12:18:59 AM
12:19:00 AM
12:19:59 AM
12:20:00 AM
12:20:59 AM
12:21:00 AM

是不是因为 System.Timers.Timer 在 windows server 2003 上不能正常工作?还是我的 VPS 有问题?

最佳答案

无需使用 DateTime.Now 并提取各个部分,只需使用 Ticks .开始时获取滴答声,然后计算下一个计时器滴答声的滴答声。一旦定时器滴答发生,使用最后一个值来计算下一个值应该是什么。

示例:

    private const long MILLISECOND_IN_MINUTE = 60 * 1000;
private const long TICKS_IN_MILLISECOND = 10000;
private const long TICKS_IN_MINUTE = MILLISECOND_IN_MINUTE * TICKS_IN_MILLISECOND;

private System.Timers.Timer timer;
private long nextIntervalTick;

public void frmMain()
{
timer = new System.Timers.Timer();
timer.AutoReset = false;
timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
timer.Interval = GetInitialInterval();
timer.Start();
}

private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{

System.Diagnostics.Trace.WriteLine(DateTime.Now.ToString("hh:mm:ss tt"));
timer.Interval = GetInterval();
timer.Start();

}
private double GetInitialInterval()
{
DateTime now = DateTime.Now;
double timeToNextMin = ((60 - now.Second) * 1000 - now.Millisecond) + 15;
nextIntervalTick = now.Ticks + ((long)timeToNextMin * TICKS_IN_MILLISECOND);

return timeToNextMin;
}
private double GetInterval()
{
nextIntervalTick += TICKS_IN_MINUTE;
return TicksToMs(nextIntervalTick - DateTime.Now.Ticks);
}
private double TicksToMs(long ticks)
{
return (double)(ticks / TICKS_IN_MILLISECOND);
}

您可能可以像以前一样使用秒和毫秒来做到这一点。诀窍是有一个起点来计算(而不是确定下一分钟的秒数)。如果存在原始问题中未提及的其他问题,例如 timer_Elapsed 中的代码可能需要一分钟以上的时间才能运行,那么您将需要添加代码来处理此问题。

如果您需要其他帮助,请发表评论。否则请选择正确答案。

关于c# - 每分钟与系统时钟同步运行(不适用于 Windows Server 2003),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11054633/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com