【问题标题】:inaccurate .NET timer?.NET 计时器不准确?
【发布时间】:2011-02-19 23:12:55
【问题描述】:

我正在开发一个应用程序,我需要从服务器获取当前日期(它与机器的日期不同)。 我从服务器接收日期并通过简单的拆分创建一个新的 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<DateTime> fechas = new List<DateTime>();

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

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 的新计时器,并且在滴答声中我将 1 秒添加到 globalVars.fec 使用:

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

但是时钟不准确,每 30 分钟时钟会丢失大约 30 秒。

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

【问题讨论】:

  • 我实际上已经启动了时间服务器,我只需要应用程序使用来自服务器而不是计算机的时间
  • C# 没有计时器。 .NET 框架可以。

标签: c# .net timer


【解决方案1】:

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

【讨论】:

  • 没想到这一点,我只是在考虑硬解决方案,而真正的解决方案非常简单。谢谢!
  • 是的,但需要每隔一段时间重新校准一次。
  • 为什么?我只是将服务器时间和本地时间之间的差异存储在 TimeSpan 中,当我需要检查日期是否匹配时,我只需执行 DateTime.Now.Add(timespan_diff);
  • 服务器和客户端时钟的可靠性如何?某人/某物改变时钟的风​​险是什么?您是否考虑过夏令时更改时会发生什么?
【解决方案2】:

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

不同的计时器(Forms.Timer、Thread.Timer 等)也会提供不同的准确度 - Forms.Timer 的准确度特别差。

您还可以使用高性能时间来更好地跟踪时间 - 例如,请参阅 here

【讨论】:

    【解决方案3】:

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

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

    我保证它比 StopWatch 和 PerformanceCounters 更快、更准确,并且明智地使用时间片中的几分之一秒!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 2021-07-09
      • 1970-01-01
      相关资源
      最近更新 更多