Служба Windows.NET с таймером прекращает отвечать

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

18
задан GEOCHET 25 June 2009 в 23:12
поделиться

6 ответов

необработанные исключения в таймерах глотают, и они тихо уничтожают таймер

, переносят тело Вашего кода таймера в блоке try-catch

18
ответ дан 30 November 2019 в 07:44
поделиться

http://support.microsoft.com/kb/842793

Это - известная ошибка, которая повторно появилась в Платформе несколько раз.

самое известное обходное решение: не используйте таймеры. Я представил эту ошибку, неэффективную путем выполнения глупого "в то время как (истинный)" цикл.

Ваш пробег может варьироваться, поэтому проверить с Вашей комбинацией битов ОС/платформы.

4
ответ дан 30 November 2019 в 07:44
поделиться

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

К Вашим другим точкам... Я не думаю, что существует что-либо "изящное" о таймере. Для меня его более прямое для наблюдения операции цикличного выполнения в коде, чем методы таймера. Но Элегантность субъективна.

Проблема памяти? Не, если Вы пишете это правильно. Возможно, нагрузка процессора, если Ваш Поток. Сон () не установлен право.

5
ответ дан 30 November 2019 в 07:44
поделиться

Интересная проблема. Если это - действительно только связанное время (т.е. не исключение), то интересно, можно ли просто периодически перерабатывать таймер - т.е.

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 и т.д. для сокращения дублирования.

3
ответ дан 30 November 2019 в 07:44
поделиться

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

0
ответ дан 30 November 2019 в 07:44
поделиться

Я сделал точно то же как Вы в нескольких проектах, но не имел проблемы.

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

0
ответ дан 30 November 2019 в 07:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: