C# 定时器需要更多的时间

C# 定时器需要更多的时间,c#,timer,C#,Timer,情景: 在Winform应用程序(C#)中,我有一个Datagridview,其中我必须以“mm:ss”格式显示4个倒计时计时器。 时间间隔必须为1000毫秒 我在system.timers.timer事件中倒计时 在所有4个计时器上,我从2分钟(02:00)开始倒计时 问题: 达到00:00所需的时间(125秒)超过2分钟。 同样,4分钟需要7-10秒(247-250秒)才能达到00:00,系统上的计时器有点不准确。更好的系统通常提供更好的计时器,但即使是最好的系统也会出现滑动 您还需要记住,

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

我在system.timers.timer事件中倒计时

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

问题: 达到00:00所需的时间(125秒)超过2分钟。
同样,4分钟需要7-10秒(247-250秒)才能达到00:00,系统上的计时器有点不准确。更好的系统通常提供更好的计时器,但即使是最好的系统也会出现滑动

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


您可能需要的是C#格式的高精度计时器(也称秒表)。请查看和以获取更多信息

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


您仍然可以使用分辨率为亚秒的计时器,以足够频繁地触发以显示,但您不需要将这些时间相加,而是使用实时时钟来获取实际经过的时间(
DateTime.Now-startTime
)。

首先,您应该运行这个小测试,并以近乎实时的方式查看漂移。在72个计时器经过的事件后,我损失了1秒(实际工作很少)

我不确定你的应用程序需要有多精确,但你可以通过使用开始时间和现在之间的差值,然后从初始值中减去该差值,然后将计时器设置为零来获得“足够好”使用这种方法会损失秒数,损失秒数很有可能发生@
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

Windows不是实时操作系统,您可能正在体验。
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