不准确的.NET计时器?

时间:2010-05-15 20:56:06

标签: c# .net timer

我正在开发一个应用程序,我需要从服务器获取当前日期(它与机器的日期不同)。 我从服务器收到日期并使用简单的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<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的新计时器,并在刻度线上使用以下内容向globalVars.fec添加1秒:

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

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

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

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:6)

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

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

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

答案 2 :(得分:2)

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

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

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