timer.interval увеличение интервала между вызовами - PullRequest
0 голосов
/ 26 сентября 2019

Итак, у меня установлен базовый таймер для пробуждения службы Windows каждую минуту

Timer timer = new Timer();
timer.Interval = 1000 * 60; // 60 seconds
timer.Elapsed += new ElapsedEventHandler(OnElapsedTime);
timer.Start();

Он работает большую часть времени, но я заметил, что каждый час он увеличивает интервал прошедшего времени в 1секунда:

[...]
Service is recall at 9/25/2019 1:26:52 AM
Service is recall at 9/25/2019 1:27:52 AM
Service is recall at 9/25/2019 1:28:52 AM
Service is recall at 9/25/2019 1:29:52 AM
Service is recall at 9/25/2019 1:30:53 AM
Service is recall at 9/25/2019 1:31:53 AM
Service is recall at 9/25/2019 1:32:53 AM
[...]

Это привело к тому, что служба пропустила отзыв службы при изменении минуты:

Service is recall at 9/20/2019 2:38:59 AM
Service is recall at 9/20/2019 2:40:00 AM

Служба не была вызвана в 2:39.

Я думаю,это происходит из-за того, что таймер активируется по истечении заданного времени, не обязательно в точное время, когда достигнут интервал, и это нормально (мне не нужна огромная точность, если служба активируется каждую минуту).Я просто не хочу, чтобы интервал между вызовами увеличивался на 1 секунду каждый час или около того.

Я пытался вычислить новый интервал (вместо 60000 миллисекунд), чтобы исправить истекшее время, но оно не является равномерным.

Есть идеи, как этого избежать?

1 Ответ

0 голосов
/ 26 сентября 2019

Таймер срабатывает каждую минуту, как вы ожидаете, но таймер не учитывает время, необходимое для обработки информации в функции.Если вам нужно, чтобы он срабатывал каждую минуту, вам нужно рассчитать количество времени, которое потребовалось для обработки вашей информации, а затем изменить количество времени, прежде чем таймер сработает:

private void OnElapsedTime()
{
    Stopwatch watch = new Stopwatch();
    watch.Start();

    //DO YOUR WORK HERE

    Timer.Change(Math.Max(0, 60000 - watch.ElapsedMilliseconds));

    watch.Stop();
}

Это не 100%точный, но должен дать желаемый результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...