Внезапная остановка System.Timers.Timer, как это могло произойти - C#
Формулировка задачи:
Есть служба виндовс в которой курится один таймер следующим образом
При старте службы это дело все запускается вызовом Init и начинает крутиться. Ну так на вскидку этот цикл не должен никогда остановится за счет try - finally. В общем то оно так и было уже около года пока недавно он не стал останавливаться, судя по тому что говорит дебаггер студии когда я приаттачился к запущенному сервису, который перестал работать как надо. Причем что интересно этот кусок не менялся уже месяца 3-4 вообще и все работало до этой недели.
Вопрос состоит в том что могло произойти и как это можно исправить? Пока только есть идея добавить try catch в блок finally на cacheUpdater.Start(); Не уж то тут может быть ошибка?)
static class TaskCallInfoCache { static Timer cacheUpdater = new Timer(); public static void Init() { cacheUpdater.Elapsed += dbTaskUpdate_Elapsed; cacheUpdater.Interval = 1000; FillCahce(); cacheUpdater.Start(); } private static void dbTaskUpdate_Elapsed(object sender, ElapsedEventArgs e) { FillCahce(); } private static void FillCahce() { try { cacheUpdater.Stop(); //некая логика } catch(Exception ex) { //тут идет сохранение ошибки в БД. По логам ошибки даже не было } finally { cacheUpdater.Start(); } } }
Решение задачи: «Внезапная остановка System.Timers.Timer, как это могло произойти»
textual
Листинг программы
public static void Init() { cacheUpdater.Elapsed += dbTaskUpdate_Elapsed; cacheUpdater.Interval = 1000; FillCacheWrapper(); cacheUpdater.Start(); } private static void dbTaskUpdate_Elapsed(object sender, ElapsedEventArgs e) { FillCacheWrapper(); } private static void FillCacheWrapper() { try { FillCache(); } catch(Exception ex) { //тут идет сохранение ошибки в БД. По логам ошибки даже не было } } private static void FillCahce() { cacheUpdater.Stop(); //некая логика // ... cacheUpdater.Start(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д