Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使计时器根据时钟以完全相同的间隔启动?_C#_.net_Wpf_Timer - Fatal编程技术网

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

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

我需要帮助设置如下计时器:

时间间隔为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

有没有办法做到这一点


任何帮助都将不胜感激。

我建议您研究一下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也提供了以特定时间间隔启动任务的工具。