NTP 更新导致 C# Winforms 计时器暂停

问题描述 投票:0回答:1

我在树莓派 .NET 4.5 上运行 C# mono (linux)。

为了这个简单测试程序的目的,假设我有一个带有

System.Windows.Forms.Timer
的简单表单。

如果我让程序在启动时运行(在 NTP 更新时间之前),计时器会正常运行,直到 NTP 决定更新系统时间。 NTP 之前的系统时间快了几分钟;当 NTP 更新时间时,计时器

Tick
函数将停止被调用。

等待几分钟后(大约与时钟开始快的时间相同),计时器

Tick
功能再次正常运行。

NTP(网络时间协议)

Jul 18 16:02:44 hostname systemd[1]: Started Network Time Synchronization.
Jul 18 16:03:32 hostname systemd-timesyncd[366]: Synchronized to time server for the first time 193.150.34.2:123 (2.debian.pool.ntp.org).

在上面的日志中,C# 程序与“Started Network Time Synchronization”大约同时启动,并正常运行不到一分钟,直到 16:03:32 计时器暂停。

设计师:

private System.Windows.Forms.Timer LogTimer;

Form1.cs

public void Form1_Load (object sender, EventArgs e)
{
    // Logging interval
    LogTimer.Tick += new System.EventHandler(this.LogTimer_tick);
    LogTimer.Interval = 100;
    LogTimer.Start();
}

private void LogTimer_tick(object sender, EventArgs e)
{
   // do stuff (display time)
   lblTime.Text = DateTime.Now.ToString("dd-MM-yy HH:mm:ss");
}

问题是 - 如何检测系统时间更改(在 Linux 上使用 C# mono),以便我可以手动重置计时器 Tick 继续正常运行(这样它就不会暂停)?

c# winforms raspberry-pi mono ntp
1个回答
0
投票

感谢评论 - 我已按照建议使用 System.Timers.Timer 尝试了以下操作,到目前为止似乎正在工作。

Form1.cs

private System.Timers.Timer LogTimer;

public void Form1_Load (object sender, EventArgs e)
{
    // Logging interval
    LogTimer = new System.Timers.Timer();
    LogTimer.Elapsed += LogTimer_Elapsed;
    LogTimer.SynchronizingObject = this;
    LogTimer.Interval = 100;
    LogTimer.Start();
}

private void LogTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
   // do stuff (display time)
   lblTime.Text = DateTime.Now.ToString("dd-MM-yy HH:mm:ss");
}

还需要更新至单声道

© www.soinside.com 2019 - 2024. All rights reserved.