C#,System.Timers.Timer,每 15 分钟运行一次,与系统时钟同步

本文关键字:一次 系统 同步 时钟 运行 Timer Timers System 分钟 | 更新日期: 2023-09-27 18:36:15

如何让 System.Timers.Timer 每 15 分钟触发一次已用事件,并与系统时钟同步?换句话说,我希望它准确地在 xx:00、xx:15、xx:30、xx:45 触发(其中 xx 表示任何小时)

C#,System.Timers.Timer,每 15 分钟运行一次,与系统时钟同步

您可以让它每秒过去一次,并检查当前时间是 00、15、30 还是 45,然后才转发事件。

第一个想法是:

private static System.Timers.Timer aTimer;
private static System.DateTime _last;
public static void Main()
{
    aTimer = new System.Timers.Timer(10000);
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    aTimer.Interval = 1000;
    aTimer.Enabled = true;
    Console.WriteLine("Press the Enter key to exit the program.");
    Console.ReadLine();
}
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    DateTime time = 
        new DateTime( 1,1,1, DateTime.Now.Hours, DateTime.Now.Minute );
    if( time.Minute==0 ||time.Minute==15 || time.Minute==30 || time.Minute==45 )
    {
        // Avoid multiple notifications for the same quarter.
        if ( _last==DateTime.MinValue || _last!=time )
        {
            _last = time;
            // Do further processing.
            doProcessing();
        }
    }
}

(基于此 MSDN 文档的示例)

启动程序或更改将触发的事件时间时,请将事件时间加载到内存中(以防止每秒从硬盘驱动器读取此数据。 然后设置一个计时器每 1 秒触发一次。 设置为每 1 秒触发一次的计时器对处理器的开销非常小。 设置一个并打开任务管理器,您甚至不会注意到处理器运行得比计时器运行之前更多。 然后在计时器事件中进行检查,以检查是否该触发事件。

使用 Quartz.net。然后,您可以使用正则表达式来定义间隔。