gpt4 book ai didi

c# - 如何根据时钟使定时器以完全相同的间隔启动?

转载 作者:太空宇宙 更新时间:2023-11-03 18:24:44 26 4
gpt4 key购买 nike

我需要像这样设置计时器的帮助:

间隔为 1 分钟的计时器从 12:25:25 (HH:MM:SS) 开始计时,第一次计时在 12:26:00 计时,然后在 12:27:00 计时,依此类推。或者使用另一个 15 分钟的间隔计时器,从 12:07:25 开始,在 12:15:00 结束,然后在 12:30:00 结束,依此类推。

我设法让 1 分钟计时器像这样响起:

OneMinute.Interval = TimeSpan.FromSeconds(60 - DateTime.Now.Second);

它工作得很好,但我仍然需要计算时钟到达 15、30、45 或 60 之前还剩多少分钟。

有什么办法可以做到这一点吗?

如有任何帮助,我们将不胜感激。

最佳答案

你可以只使用一个特殊的初始化定时器:

  • 计算到下一个所需滴答的时间跨度
  • 将初始间隔设置为该时间跨度
  • 开始计时
  • 在第一次滴答后,将间隔设置为所需的时间跨度。

StartPlainTimer 方法

// Define other methods and classes here
private static DispatcherTimer StartPlainTimer(TimeSpan interval)
{
var millisecondsLeftToday = DateTime.Now.TimeOfDay.TotalMilliseconds;
var millisecondsInterval = interval.TotalMilliseconds;
var firstInterval = millisecondsInterval - ((millisecondsLeftToday / millisecondsInterval) % 1) * millisecondsInterval;
var timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(firstInterval);
timer.Tag = interval;
Console.WriteLine("Start: " + DateTime.Now);
timer.Tick += ResetInterval;
timer.Start();
return timer;
}

private static void ResetInterval(object sender, EventArgs args)
{
var timer = sender as DispatcherTimer;
timer.Interval = (TimeSpan)timer.Tag;
timer.Tick -= ResetInterval;
}

用法

// Example for a timer that runs all 3 seconds
var timer = StartPlainTimer(TimeSpan.FromSeconds(3));
timer.Tick += (s, e) => Console.WriteLine(DateTime.Now);

输出

Start: 02.06.2016 16:26:41
02.06.2016 16:26:42
02.06.2016 16:26:45
02.06.2016 16:26:48

更详细的时间格式显示了该方法的不准确性:

15 秒示例:

Start: 06.02.2016 04:44:50.902 
06.02.2016 04:45:00.017
06.02.2016 04:45:15.018
06.02.2016 04:45:30.024
06.02.2016 04:45:45.022
06.02.2016 04:46:00.027
06.02.2016 04:46:15.031
06.02.2016 04:46:30.036

因此,如果 100 毫秒的精度就足够了,那么该解决方案应该适合您。

关于c# - 如何根据时钟使定时器以完全相同的间隔启动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37593241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com