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);
不可能。这将要求您确切地知道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);