Обработка задержек во время запросов остановки / паузы в службе Windows - PullRequest
3 голосов
/ 27 января 2010

У меня есть класс обслуживания Windows, производный от ServiceBase, который использует System.Timers.Timer для запуска кода через определенные промежутки времени. Обработчики для OnStop и OnPause используют некоторую сигнализацию с потоком таймера, чтобы проверить, работает ли таймер и ожидает ли он его завершения.

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

Должен ли я просто ждать, пока SCM не сдастся (но это переведет службу в состояние, в котором вы ничего не можете сделать со службой, кроме как уничтожить процесс, и иногда перезагрузка - единственный способ перезапустить его) ? Или я мог бы выдать исключение, возможно (это оставило бы его в аналогичном состоянии или просто отменить запрос на остановку / паузу)?

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

Ответы [ 2 ]

2 голосов
/ 27 января 2010

Вы можете использовать метод RequestAdditionalTime , чтобы сообщить SCM о том, что вам нужно больше времени для остановки / приостановки обслуживания.

1 голос
/ 27 января 2010

Я уперся головой в то, что СКМ сдался, заставив мою службу замерзнуть, как будто она загорала в Антарктиде в июне.

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

Мне нравится, что мое программное обеспечение запускается / выходит / приостанавливается и даже изящно умирает.

Решением, которое я реализовал, было использование файла конфигурации. Я поместил параметр ExecutionMode в файл. В начале каждого цикла обработки он проверяет файл конфигурации - если ExecutionMode имеет значение Pause или Stop , то он выполняет код для изменения состояния и использует SMTP для отправки электронного письма на электронную почту. идентификаторы, перечисленные в параметре ServiceChangeNotification. В электронном письме указываются следующие данные: имя компьютера, отметка времени, имя службы, старое состояние, время запуска старого состояния, текущее состояние, время запуска текущего состояния, подробности журнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...