Внезапная остановка System.Timers.Timer, как это могло произойти - C#

Узнай цену своей работы

Формулировка задачи:

Есть служба виндовс в которой курится один таймер следующим образом
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();
        }
    }
}
При старте службы это дело все запускается вызовом Init и начинает крутиться. Ну так на вскидку этот цикл не должен никогда остановится за счет try - finally. В общем то оно так и было уже около года пока недавно он не стал останавливаться, судя по тому что говорит дебаггер студии когда я приаттачился к запущенному сервису, который перестал работать как надо. Причем что интересно этот кусок не менялся уже месяца 3-4 вообще и все работало до этой недели. Вопрос состоит в том что могло произойти и как это можно исправить? Пока только есть идея добавить try catch в блок 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();        
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5