定时器需要更多时间

时间:2012-07-24 16:27:05

标签: c# timer

方案: 在Winform应用程序(C#)中,我有一个Datagridview,我必须以“mm:ss”格式显示4个倒计时器。 时间间隔必须为1000毫秒。

我在system.timers.timer的已用事件中计算了计时器。

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

问题: 到达00:00需要更多时间(125秒)而不是2分钟。 类似地,对于4分钟,到达00:00还需要7-10(247-250)秒。

3 个答案:

答案 0 :(得分:2)

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

您还需要记住,您的过程不会在100%的时间内处于“完全控制”状态,有时会被推到后台,并且必须与其他应用程序共享处理器,所以尽管如此最好跟踪时间。

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

答案 1 :(得分:0)

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

您仍然使用具有亚秒级分辨率的计时器来频繁启动以进行显示,但是您没有将这些时间加起来,您使用实时时钟来获取实际经过的时间(DateTime.Now - startTime )。

答案 2 :(得分:0)

首先,你应该进行这个小测试,看看近乎实时的漂移。在经过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