Внезапная остановка 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();
}