Любая переменная, объявленная вне функции, считается глобальной, это только при объявлении их изнутри функций (кроме конструкторов), которые вы должны указать, что переменная будет глобальной.
необработанные исключения в таймерах глотают, и они тихо уничтожают таймер
, переносят тело Вашего кода таймера в блоке try-catch
http://support.microsoft.com/kb/842793
Это - известная ошибка, которая повторно появилась в Платформе несколько раз.
самое известное обходное решение: не используйте таймеры. Я представил эту ошибку, неэффективную путем выполнения глупого "в то время как (истинный)" цикл.
Ваш пробег может варьироваться, поэтому проверить с Вашей комбинацией битов ОС/платформы.
Я видел это прежде и с таймером и циклично выполнил сервисы. Обычно случай - то, что исключение поймано, который останавливает таймер или поток цикличного выполнения, но не перезапускает его как часть восстановления исключения.
К Вашим другим точкам... Я не думаю, что существует что-либо "изящное" о таймере. Для меня его более прямое для наблюдения операции цикличного выполнения в коде, чем методы таймера. Но Элегантность субъективна.
Проблема памяти? Не, если Вы пишете это правильно. Возможно, нагрузка процессора, если Ваш Поток. Сон () не установлен право.
Интересная проблема. Если это - действительно только связанное время (т.е. не исключение), то интересно, можно ли просто периодически перерабатывать таймер - т.е.
private void tickTack_Elapsed(object sender, ElapsedEventArgs e)
{
CheckForRecycle();
// ... actual code
}
private void CheckForRecycle()
{
lock(someLock) {
if(++tickCount > MAX_TICKS) {
tickCount = 0;
tickTack.Stop();
// re-create timer
tickTack = new Timer(...);
tickTack.Elapsed += ...
tickTack.Start();
}
}
}
Вы могли бы, вероятно, объединить блоки этого с OnStart
/ OnStop
и т.д. для сокращения дублирования.
Вы проверили журналы ошибок? Возможно, у Вас заканчиваются таймеры так или иначе. Возможно, можно создать всего один таймер, когда Вы инициализируете ArchiveService и пропускаете материал OnStart.
Я сделал точно то же как Вы в нескольких проектах, но не имел проблемы.
у Вас есть код в tickTac_Elapsed, который может вызывать это? Как цикл, который никогда не заканчивается или некоторая ошибка, которая останавливает таймер, с помощью потоков и ожидая окончания тех и так далее?