我在树莓派 .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 继续正常运行(这样它就不会暂停)?
感谢评论 - 我已按照建议使用 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");
}
还需要更新至单声道。