Использование нескольких System.Timers в проблеме службы Windows

1

У меня есть несколько таймеров в службе Windows для разных вещей:

        timerForUpdate = new Timer();
        timerForSyncByServer = new Timer();
        timerForGetFactors = new Timer();
        timerForDelete = new Timer();
        timerForHandshaking = new Timer();
        timerForConfig = new Timer();

        timerForSyncByServer.Interval = 35000;
        timerForUpdate.Interval = 40000;
        timerForDelete.Interval = 30000;
        timerForGetFactors.Interval = 200000;
        timerForHandshaking.Interval = 60000;
        timerForConfig.Interval = 10000;

Как вы видите, у них разные интервалы, но в некоторых случаях операция занимает слишком много времени, и одновременно работают две таймеры одновременно, и это плохо.

Я пытаюсь использовать блоки lock для решения проблемы:

 public object CrossTimer = new object();
 void timerForConfig_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (CrossTimer)
            {
                ConfigOperation.UpdateWebConfig();
            }
        }

        void timerForHandshaking_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (CrossTimer)
            {
                HandshakeOperations.ShakeHand();
            }
        }

        void timerForDelete_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (CrossTimer)
            {
                FoodTypesOperations.DeleteWebDB();
                KalaToleedOperations.DeleteWebDB();
            }
        }
        void timerForGetFactors_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (CrossTimer)
            {
                FactorOperations.GetLastFactors();
            }
        }

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

  • 0
    Интервалы разные, но иногда мултипулы интервала одинаковы. Например, после 120000 все таймеры Update , Delete и Handshake сработают одновременно. Что ты хочешь случиться тогда?
  • 0
    @Damien_The_Unbeliever Точно правильно, я хочу, чтобы на работе было рукопожатие, Удалить, дождаться окончания работы
Теги:
multithreading
timer
windows-services

1 ответ

2

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

Initialize count to 0
Initialize rundate to Now()
While(true)
    count++
    if(count==840) count = 0
    if(count%7==0) DoSyncByServer()
    if(count%8==0) DoUpdate()
    if(count%6==0) DoDelete()
    if(count%40==0) DoFactors()
    if(count%12==0) DoHandshake()
    if(count%2==0) DoConfig()
    rundate += 5 seconds
    interval = Now() - rundate
    if(interval > 0)
       sleep(interval)
    end if
end while

Значение while(true) может быть изменено на WaitOne(0) в ManualResetEvent если это ваш предпочтительный способ сигнализировать об отключении потока, когда служба останавливается.

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

  • 0
    Спасибо за ваш ответ, ваше решение хорошо, но почему блокираторы блокировки не работают в таймерах?
  • 1
    @SamanGholami - они должны. Трудно определить, почему он не работает, не имея всего вашего кода (о котором я не буду вас просить) и возможности запустить / протестировать / отладить его. Но кажется, что вы вводите весь этот потенциальный параллелизм, имея несколько таймеров, а затем вкладываете больше усилий для устранения параллелизма - вот почему я перешел к тому, чтобы вообще не вводить его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню