Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 不准确的.NET计时器?_C#_.net_Timer - Fatal编程技术网

C# 不准确的.NET计时器?

C# 不准确的.NET计时器?,c#,.net,timer,C#,.net,Timer,我正在开发一个应用程序,我需要从服务器获取当前日期(它与机器的日期不同)。 我从服务器收到日期,通过简单的拆分,我创建了一个新的日期时间: 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是

我正在开发一个应用程序,我需要从服务器获取当前日期(它与机器的日期不同)。 我从服务器收到日期,通过简单的拆分,我创建了一个新的日期时间:

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>();
现在我有了来自服务器的日期,所以DateTime。现在不能在这里使用。相反,我创建了一个间隔为1000的新计时器,在滴答声中,我使用以下方法向globalVars.fec添加1秒:

globalVars.fec = globalVars.fec.AddSeconds(1);
但是时钟不准确,每30分钟钟就会慢30秒


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

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

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

不同的计时器(Forms.Timer、Thread.Timer等)也会给出不同的精度-Forms.Timer的精度特别差


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

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


我保证它比秒表和性能计数器更快、更准确,并明智地利用时间片中的几分之一秒

我实际上已经启动了时间服务器,我只需要应用程序使用服务器上的时间,而不是电脑的oneC没有计时器。NET框架有。我没有想到这一点,我只是在考虑硬解决方案,而真正的解决方案非常简单。谢谢是的,但是需要经常重新校准。为什么?我只是将服务器时间和本地时间之间的差异存储在TimeSpan中,当我需要检查日期是否匹配时,我只做DateTime.Now.Add(TimeSpan_diff);服务器和客户端时钟的可靠性如何?某人/某事改变时钟的风险有多大?你是否考虑过夏日储蓄会发生什么变化?
globalVars.fec = globalVars.fec.AddSeconds(1);