C# 如何使计时器根据时钟以完全相同的间隔启动?
我需要帮助设置如下计时器: 时间间隔为1分钟的计时器从12:25:25(HH:MM:SS)开始,第一次在12:26:00和12:27:00停止,依此类推。或者用另一个15分钟的间隔计时器,从12:07:25开始,在12:15:00,然后在12:30:00,依此类推 我设法让1分钟计时器像这样响:C# 如何使计时器根据时钟以完全相同的间隔启动?,c#,.net,wpf,timer,C#,.net,Wpf,Timer,我需要帮助设置如下计时器: 时间间隔为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
OneMinute.Interval=TimeSpan.FromSeconds(60-DateTime.Now.Second)代码>
它工作得很好,但我仍然需要计算出还有多少分钟,直到时钟达到15、30、45或60
有没有办法做到这一点
任何帮助都将不胜感激。我建议您研究一下Quartz.net之类的框架
Windows 7之后的.NET计时器的问题是,它们的分辨率约为15毫秒,因此,即使您在特定时间精确启动,您也可能会看到随着时间的推移而滑动
编辑:Quartz.net示例代码
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 42 10 * * ?")
.ForJob("myJob", "group1")
.Build();
这将建立一个每天10:42触发的触发器。虽然这并不能给出您想要的确切答案,但您可以用CRON类型的方式安排任务。因此,您可以实现这样的15分钟执行间隔。不过,您需要阅读更多的文档来理解这个框架。经过一些测试和计算,我能够成功地获得剩余的分钟数,直到时钟达到15倍
以下是方法:
fifteennminutes.Interval=TimeSpan.frommins(15-DateTime.Now.Minute%15)代码>
谢谢大家的帮助!这是迫切需要的。您可以使用一个特殊的初始化计时器:
- 计算到下一个所需刻度的时间跨度
- 将初始间隔设置为该时间跨度
- 启动计时器
- 第一次勾选后,将间隔设置为所需的时间跨度
起始血小板法
// 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毫秒的精度足够,那么这个解决方案应该适合您。这可能是一个关于计时精度的好建议,但您仍然没有回答这个问题。如果他使用Quartz.net,他可以实现他的要求,我认为这本身就是一个答案。我将提供一个代码示例。我感谢您的指导。我对提供关于SO的答案非常陌生,因此我认为我需要更好地量化我的回答。这很有帮助,但我仍然需要一个解决方案以特定的时间间隔启动计时器。Quartz也提供了以特定时间间隔启动任务的工具。