C#计时器以完整的秒数开始

时间:2016-10-25 13:30:56

标签: c# timer

有没有办法运行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);

2 个答案:

答案 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后,循环将退出,线程将终止。

尽管秒启动后可能会触发几毫秒,但它足够接近,以至于用户认为计时器应该计时,只要能在不到一秒的时间内完成工作,它就不会丢失秒数。