计时器需要更多时间

计时器需要更多时间

问题描述:

场景: 在Winform应用程序(C#)中,我有一个Datagridview,其中必须以格式“mm:ss”显示4个倒数计时器。 时间间隔必须为1000ms。计时器需要更多时间

我正在计数system.timers.timer过去的事件中的计时器。

在所有4个计时器中,我开始从2分钟(02:00)开始倒计时。

问题: 需要更多时间(125秒)超过2分钟,才能达到00:00。 类似地,持续4分钟需要7-10(247-250)秒才能到达00:00

+2

Windows不是实时操作系统 – 2012-07-24 16:37:14

系统上的定时器有点不准确。更好的系统通常提供更好的定时器,但即使是最好的系统也有滑动。

您还需要记住,您的进程在100%的时间内不会处于“完全控制”状态,有时会被推入后台并与其他应用程序共享处理器,尽最大努力跟踪时间。

你可能想要的是C#中的高精度定时器(又名秒表)。有关更多信息,请参阅This threadThis article on selecting timer mechanisms

如果您需要该类型的时间分辨率(即实际时钟或倒数计时器),则应使用实时时钟。

您仍然使用具有亚秒分辨率的定时器足够频繁地触发以用于显示目的,但是您不会将这些时间加起来,而是使用实时时钟来获取实际的经过时间(DateTime.Now - startTime)。

首先,你应该运行这个小测试,并近乎实时地看到漂移。在72个定时器事件发生后,我失去了1秒钟(这是非常少的实际工作)。

using (var timer = new Timer(1000)) 
{ 
    var start = DateTime.Now; 
    var i = 0; 
    timer.Elapsed += (sender, args) => Console.WriteLine("{0} -> {1}", ++i, (DateTime.Now - start).TotalMilliseconds); 
    timer.Start(); 
    Thread.Sleep(130*1000); 
} 

我不知道您的应用的具体需求是,但你可以通过使用增量的开始时间&从现在减去得到“足够好”,从您的初始值和零杀死计时器。 用这种方法你会失去秒,并有一个合理的机会,第二次失败可能发生@0:00导致-0:01打勾,你需要处理。

var countdownSeconds = 120; 
var startedAt = DateTime.Now; 

var timer = new Timer(1000);  
timer.Elapsed += (sender, args) => Display(countdownSeconds - (int)((DateTime.Now - startedAt).TotalSeconds)); 
timer.Start(); 

//- be sure to dispose the timer