C#计时器在精确的整秒启动

C#计时器在精确的整秒启动,c#,timer,C#,Timer,是否有办法运行计时器,使其在精确的整秒启动? stateTimer = new Timer(someCallback, null, 0, 1000); 这个程序将立即启动,每秒钟重复一次,但问题是它将在我运行程序时准确启动,这可能导致13:14:15.230start 我想13:14:15.000开始。比如: stateTimer = new Timer(someCallback, null, DateTime.Now.Date, 1000); 可能吗 编辑: 执行控制台日志后: Conso

是否有办法运行
计时器
,使其在精确的整秒启动?

stateTimer = new Timer(someCallback, null, 0, 1000);
这个程序将立即启动,每秒钟重复一次,但问题是它将在我运行程序时准确启动,这可能导致
13:14:15.230
start

我想
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秒(每次迭代大约1,02次),所以在50次迭代之后,跳过1秒。我解决了我的问题,改为让计时器每800毫秒运行一次。这不是一个理想的解决方案,但它是有效的,而且第二个也不会被跳过(我可以两次触发同一个第二个)


不,那是不可能的。这需要您确切地知道CPU何时认为开始执行计时器代码是个好主意。即使在剩下的时间里执行
Thread.Sleep
,也不意味着代码是在你想要的毫秒内执行的


相反,如果您只是想进行格式化,可以使用自定义日期/时间格式进行格式化。

不,这是不可能的。这需要您确切地知道CPU何时认为开始执行计时器代码是个好主意。即使在剩下的时间里执行
Thread.Sleep
,也不意味着代码是在你想要的毫秒内执行的


相反,如果您只是想进行格式化,您可以使用自定义日期/时间格式进行格式化。

我必须在一个程序中执行类似的操作,该程序显示时间并显示分钟数和秒数,直到用户可以执行某项操作为止

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

private ManualResetEvent myThreadRequestExit = new ManualResetEvent(false);

while (!myThreadRequestExit.WaitOne(1000 - DateTime.UtcNow.Millisecond))
{
    // Do the one-second work here
}
设置MyThreadRequestExit时,循环将退出,线程将终止


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

我不得不在一个显示时间和分钟数的程序中执行类似的操作秒,直到用户可以做某事

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

private ManualResetEvent myThreadRequestExit = new ManualResetEvent(false);

while (!myThreadRequestExit.WaitOne(1000 - DateTime.UtcNow.Millisecond))
{
    // Do the one-second work here
}
设置MyThreadRequestExit时,循环将退出,线程将终止


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

如果计时器没有准确地在第二秒运行,为什么会出现问题?您可以计算到下一秒还有多长时间当你想启动它并睡眠那么久,然后再启动它的时候,但要注意Windows不是一个实时操作系统,它不能保证你的计时器会精确地按你指定的时间间隔运行,只能“足够接近”。为什么你需要这样精确?没有分数部分的“秒”是一个想象的或理论的概念,它是完全任意的。一个人(或计算机)认为是一个准确的/完整的秒,另一个思考是在两秒钟的中间,因为不可能使两者同步。除非你能解释为什么在你的情况下这是必要的或有用的,否则这个问题就没有价值了。是什么阻止操作系统在16毫秒内切换到另一个线程?没有什么。因此,即使可以做你想做的事情,但事实并非如此,你仍然会有同样的问题。如果计时器没有在第二秒准确运行,那么为什么会有问题?你可以计算下一次你想启动它并睡那么久的时间,然后启动它,但是请注意,Windows并不是一个实时操作系统,它不能保证您的计时器会精确地按您指定的时间间隔运行,只是“足够接近”。为什么你需要这样精确?没有分数部分的“秒”是一个想象的或理论的概念,它是完全任意的。一个人(或计算机)认为是一个准确的/完整的秒,另一个思考是在两秒钟的中间,因为不可能使两者同步。除非你能解释为什么在你的情况下这是必要的或有用的,否则这个问题就没有价值了。是什么阻止操作系统在16毫秒内切换到另一个线程?没有什么。所以,即使有可能做你想做的事情,但事实并非如此,你仍然会遇到同样的问题