Однопоточная служба Windows, задерживающая OnStop - PullRequest
2 голосов
/ 16 ноября 2011

У меня есть служба Windows (C # 4.0), которая отбирает сообщения из личной очереди сообщений и для каждого сообщения отправляет одно или несколько сообщений электронной почты (обычно не более 4 или 5) в зависимости от содержимого сообщения.

Объем сообщения низок, поэтому я избежал сложности и оставил службу поточной, но электронные письма важны, поэтому я должен убедиться, что по команде SCM Stop все обрабатываемые сообщения / электронные письма обрабатываются / отправляютсядо завершения Stop.

В OnStop я проверяю статический флаг "inProcess", представляющий состояние, и если он установлен, я вызываю ServiceBase.RequestAdditionalTime (120000).

Есть 2 проблемы:

  1. Команда «Стоп» завершается немедленно с некоторым неотправленным электронным письмом, несмотря на запрос в течение 2 минут.
  2. Даже если это сработало, я только догадываюсь, как долго мне ждать.

Как лучше всего справиться с этим в однопоточном сервисе?

Спасибо за вашу помощь!

Грег

1 Ответ

0 голосов
/ 17 ноября 2011

Чтобы получить полный ответ, нам нужно увидеть структуру вашего цикла обработки сообщений. Но я думаю, что метод ServiceBase.RequestAdditionalTime() используется для того, чтобы SCM не жаловался, если команда останова (или пауза, продолжение, запуск) занимает слишком много времени, это не значит, что ваша служба будет ждать две минуты, прежде чем остановка.

Таким образом, единственное, что он действительно делает, это предотвращает ошибку SCM при запросе на остановку, если у вас медленный процесс остановки.

См. MSDN здесь: Метод RequestAdditionalTime ()

Что меня интересует, так это если вас вызывают в OnStop() и вы устанавливаете какой-либо флаг завершения, и цикл обработки немедленно завершается, когда видит этот флаг?

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

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

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