System.Timers.Timer, блуждающий в рабочей роли Azure - PullRequest
0 голосов
/ 16 сентября 2011

У меня есть рабочая роль Azure с n (в настоящее время n = 2) экземплярами. Каждый из этих экземпляров имеет System.Timers.Timer в своем основном потоке, который выполняется каждые 20 секунд, порождая некоторые рабочие процессы. Когда экземпляры роли загружаются изначально, они синхронизируются через внутренние конечные точки, так что таймеры запускаются одновременно (это работает).

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

Мой метод запуска в основном следующий:

public override void Run()
{
    while (true) 
    {               
        GC.KeepAlive(this.LogTimer); // make sure garbage collection never touches the timer                                            
    }
}

Вопросы:

  1. Что может быть причиной этого?
  2. Улучшило бы добавление вызова Thread.Sleep (sleeptimeinMS) в цикл while (true) {} это предотвращает постоянную занятость основного потока (для позволить потоку таймера как-то более свободно выполнять свой долг?)?
  3. Правильный ли ответ, что я должен попытаться повторно синхронизировать роли с некоторыми внешние часы периодически?
  4. Есть ли принципиально разные способы реализации этого?

Заранее спасибо за ваше время,

Alex

1 Ответ

2 голосов
/ 16 сентября 2011

System.Timers.Timer не на 100% точен, он ограничен планированием потоков в ОС. Имеет смысл, что два отдельных сервера, каждый из которых работает по таймеру, в конечном итоге выйдут из синхронизации.

...