vb. net - Таймер перестает работать при остановке и запуске - PullRequest
0 голосов
/ 12 января 2020

У меня есть приложение, которое запускает несколько таймеров.

Первый - это таймер сердцебиения, HB_Timer, который запускает фонового работника с заданным интервалом, который запускает команду sql, чтобы зарегистрировать «сердцебиение». Второй - таймер повторного запуска, Reinit_Timer, который снова запускает фонового работника для запроса глобальных настроек из базы данных и, если значение для интервала пульса изменилось, останавливает HB_Timer, соответственно изменяет HB_Timer.Interval и затем перезапускает HB_Timer.

Я немного изменил приведенный ниже код, чтобы перевести его в самый простой формат c. Интервал сердцебиения в БД сохраняется в секундах, поэтому я умножаю его на 1000, чтобы получить мс перед применением интервала ...

 Public Function Endpoint_ReInit()
    Try
        HB_Timer.Stop()
        hb_interval = ReadSQLValue(<the data i need to read...>)
        If hb_interval > 0 Then HB_Timer.Interval = (hb_interval * 1000)
        HB_Timer.Start()

По какой-то причине, если таймер остановлен, он не запустится снова программно и я не понимаю почему. Я добавил console.writeline в событие tick таймера и при запуске фонового работника ... оба работают до его остановки, а затем перезапускаются, а затем не работают (очевидно, если первое не работает, то второе определенно не будет).

Я задавался вопросом, будет ли это быстро, поэтому пытался спать в течение периодов между остановкой и запуском, но это не сработало.

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

У меня есть обработка ошибок во всех моих функциях et c и никаких исключений не выбрасывается.

Я немного растерялся ... Может кто-нибудь помочь мне направить меня в правильном направлении?

1 Ответ

0 голосов
/ 12 января 2020

По-видимому, значение, возвращаемое из запроса SQL, велико, поэтому таймер не останавливается, а просто тикает очень много времени.

Или что-то дает сбой в фоновом режиме и, следовательно, ваш timer.Start() никогда не вызывается (вызов ReadSQLValue() никогда не возвращается). Если ReadSQLValue() использует BackgroundWorker, хотя я не совсем уверен, как вы управляете микшированием sync / asyn c, имейте в виду, что когда BackgroundWorker испытывает исключение в DoWork(), это может не закончиться в вашем коде в тот момент, когда это происходит. BGW просто запускает событие RunWorkerCompleted с EventArgs, у которого есть исключение в свойстве Error)

Когда я работаю с таймерами, я склонен устанавливать их на некоторый низкий интервал, скажем, 1 секунду, и если Я хочу, чтобы что-то происходило каждую минуту для одного процесса и две минуты для другого. У меня есть пара значений, которые отсчитывают от 60/120 соответственно, и когда они достигают 0, я выполняю процессы и сбрасываю значения обратно до 60/120. Я не останавливаю / не запускаю / не изменяю интервал таймера

...