C #, System.Timers.Timer, запускать каждые 15 минут синхронно с системными часами

Как получить System.Timers.Timer для запуска событий Elapsed каждые 15 минут синхронно с системными часами? Другими словами, я хочу, чтобы он срабатывал точно в xx: 00, xx: 15, xx: 30, xx: 45 (где xx означает любой час)

 Henk Holterman05 июн. 2012 г., 13:38
@MitchWheat - «невозможно» маловероятно, учитывая множество инструментов, которые у нас есть (и речь идет не о микросекундах).
 Uwe Keim05 июн. 2012 г., 13:32
Вы можете позволить ему проходить каждую секунду и проверять, является ли текущее время 00, 15, 30 или 45, и только затем пересылать событие.
 vanu05 июн. 2012 г., 13:40
Сначала установите значение тайм-аута таймера на миллисекунду, эквивалентное 15 мин. затем проверьте системные часы, если он даетmm (минуты), например, 00,15,30 или 45. Если TRUE, запустите таймер. Таймер автоматически запускает функцию Timer.Elapsed через каждый интервал времени. Это всего лишь идея, конечно.
 Mitch Wheat05 июн. 2012 г., 13:33
& APOS; ровно & APOS; вряд ли возможно из-за других системных действий ...
 Hans Passant05 июн. 2012 г., 14:02
Обязательно установите для свойства AutoReset значение false. И каждый раз пересчитывать следующий интервал из DateTime.Now, чтобы он оставался точным.

Ответы на вопрос(3)

используйте Quartz.net. Затем вы можете использовать регулярные выражения для определения интервала.

Вы можете позволить ему проходить каждую секунду и проверять, является ли текущее время 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 секунду, очень мало загружает процессор. Установите один и откройте диспетчер задач, и вы даже не заметите, что процессор работает больше, чем до запуска таймера. Затем установите флажок в событии таймера, чтобы проверить, пришло ли время инициировать событие.

Ваш ответ на вопрос