有没有办法运行Timer
以便它以完整的秒数开始?
stateTimer = new Timer(someCallback, null, 0, 1000);
这个会立即开始,重复每一秒,但问题是它会在我运行程序时启动,这可能会导致13:14:15.230
启动。
我希望13:14:15.000
开始。类似的东西:
stateTimer = new Timer(someCallback, null, DateTime.Now.Date, 1000);
这可能吗?
修改
执行控制台日志后:
Console.WriteLine($"Time: {DateTime.Now.ToString("HH:mm:ss.fff")}");
我注意到1秒间隔实际上增加了一秒以上(每次迭代约1,02次),因此在50次迭代后会跳过一秒。我已经解决了我的问题,让计时器每800毫秒运行一次。不是理想的解决方案,但它可以工作,第二次永远不会被跳过(我在触发相同的秒数两次没有问题)。
stateTimer = new Timer(someCallback, null, 0, 800);
答案 0 :(得分:6)
不,这是不可能的。这将要求您确切知道CPU何时认为开始执行您的计时器代码是个好主意。即使您在剩余时间内<marker><marker>...</marker></marker>
,它仍然不意味着代码在您想要的毫秒内执行。
相反,如果您只想对格式化执行此操作,则可以使用自定义日期/时间格式来执行此操作。
答案 1 :(得分:0)
我必须在一个程序中做类似的事情,该程序显示时间并显示分钟和秒数,直到用户可以做某事为止。
原始代码使用了1000毫秒的计时器。这有原始海报描述的问题。我创建了一个线程。线程有一个循环:
private ManualResetEvent myThreadRequestExit = new ManualResetEvent(false);
while (!myThreadRequestExit.WaitOne(1000 - DateTime.UtcNow.Millisecond))
{
// Do the one-second work here
}
设置MyThreadRequestExit后,循环将退出,线程将终止。
尽管秒启动后可能会触发几毫秒,但它足够接近,以至于用户认为计时器应该计时,只要能在不到一秒的时间内完成工作,它就不会丢失秒数。