不准确的.NET计时器?

我正在开发一个应用程序,我需要从服务器获取当前日期(它与机器的日期不同)。 我从服务器收到日期并使用简单的Split我创建一个新的DateTime:

globalVars.fec = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, int.Parse(infoHour[0]), int.Parse(infoHour[1]), int.Parse(infoHour[2])); 

globalVars是一个类,fec是一个公共静态变量,因此我可以在应用程序的任何地方访问它(我知道编码错误…)。 现在我需要有一个计时器来检查该日期是否等于我在List中存储的某些日期,如果它相等,我只需要调用一个函数。

 List fechas = new List(); 

在必须从服务器获取日期之前我使用计算机的日期,所以要检查日期是否匹配我使用的是:

 private void timerDatesMatch_Tick(object sender, EventArgs e) { DateTime tick = DateTime.Now; foreach (DateTime dt in fechas) { if (dt == tick) { //blahblah } } } 

现在我有来自服务器的日期,所以DateTime.Now不能在这里使用。 相反,我已经创建了一个Interval = 1000的新计时器,并且在tick上我使用以下内容向globalVars.fec添加1秒:

 globalVars.fec = globalVars.fec.AddSeconds(1); 

但时钟不准确,每30分钟时钟损失约30秒。

有没有其他方法可以做我想做的事情? 我考虑过使用threading.timer,但我需要访问其他线程和非静态函数。

存储服务器时间和本地时间之间的差异。 使用该差异计算服务器所需的时间。

如果您创建间隔为1000毫秒的atimer,则会在1000毫秒之前调用它。 因此,您几乎可以保证它将在超过1000毫秒内被调用,这意味着您将通过在此计时器滴答中添加1来“丢失”时间 – 这将在每个滴答时累积错误 。 更好的方法是记录开始时间并使用当前时间来确定与已知开始时间的当前偏移量,这样就不会在时间上累积任何错误。 (仍然会有一些错误,但随着时间的推移你不会失去实时性)

不同的计时器(Forms.Timer,Thread.Timer等)也会给出不同的准确性 – Forms.Timer的准确性特别差。

您还可以使用高性能时间来更好地跟踪时间 – 例如,请参阅此处 。

这是一个可靠的1μs定时器

请参阅https://stackoverflow.com/questions/15725711/obtaining-microsecond-precision-using-net-without-platform-invoke?noredirect=1#comment22341931_15725711

我保证它比StopWatch和PerformanceCounters更快更准确,并且明智地使用你在时间片中的一小部分!