c#计时器从精确的整秒开始

本文关键字:开始 计时器 | 更新日期: 2023-09-27 18:14:45

是否有一种方法可以运行Timer,使其在精确的完整秒开始?

stateTimer = new Timer(someCallback, null, 0, 1000);

这个将立即启动,每秒钟重复一次,但问题是它将在我运行程序时恰好启动,这可能导致13:14:15.230启动。

我想要13:14:15.000 start。比如:

stateTimer = new Timer(someCallback, null, DateTime.Now.Date, 1000);

这可能吗?

编辑:

完成控制台日志后:

Console.WriteLine($"Time: {DateTime.Now.ToString("HH:mm:ss.fff")}");

我注意到1秒间隔实际上增加了1秒以上(每次迭代大约1,2秒),所以在50次迭代后跳过了1秒。我通过让计时器每800ms运行一次来解决我的问题。不是理想的解决方案,但它工作,并且秒永远不会被跳过(我在触发相同的秒两次没有问题)。

stateTimer = new Timer(someCallback, null, 0, 800);

c#计时器从精确的整秒开始

不可能。这将要求您确切地知道CPU认为何时开始执行计时器代码是一个好主意。即使您将Thread.Sleep用于剩余的时间,这仍然不意味着代码将在您想要的毫秒内执行。

相反,如果你只是想这样做格式化,你可以使用自定义日期/时间格式。

我必须在一个程序中做类似的事情,显示时间和显示分钟数和秒数,直到用户可以做某事。

原始代码使用1000毫秒计时器。这就出现了最初海报中描述的问题。我创建了一个线程。线程有一个循环:

private ManualResetEvent myThreadRequestExit = new ManualResetEvent(false);
while (!myThreadRequestExit.WaitOne(1000 - DateTime.UtcNow.Millisecond))
{
    // Do the one-second work here
}

当设置MyThreadRequestExit时,循环将退出,线程将终止。

虽然它可能在秒开始后几毫秒触发,但它足够接近用户感觉到计时器在滴答作响,只要工作可以在不到一秒的时间内完成,它就不会丢失秒。

在启动计时器之前添加这一行。甜美又简单:)

Thread.Sleep(1000 - DateTime.Now.Millisecond);