Как программно остановить службу Windows? - PullRequest
6 голосов
/ 21 августа 2009

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

Он будет развернут на сервере, который будет запускаться ежемесячно. Я не начал эту вещь, и код был дан мне так. Он написан на VB.NET, и меня сейчас просят изменить несколько вещей вокруг него. Я заметил, что есть только «Sub OnStart» и удивился, когда служба остановится? После того, как основной саб сделан, каков статус этого сервиса? Это остановлено или просто висело там? Извините, как я уже сказал, я действительно новичок в этом ....

Ответы [ 7 ]

7 голосов
/ 21 августа 2009

Если у вас есть задача, которая повторяется ежемесячно, вам лучше написать консольное приложение, а затем использовать Windows Task Scheduler , чтобы настроить его запуск ежемесячно. Служба должна использоваться для процессов, которые должны выполняться в течение длительного времени или постоянно, с пользователем или без него, вошедшим в систему

6 голосов
/ 21 августа 2009

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

Однако, если вы по какой-то причине обязаны работать в качестве службы Windows и работаете в .NET, вам просто нужно вызвать метод Stop(), унаследованный от ServiceBase, как только ваша служба завершит свою работу. Из документации MSDN для метода:

Метод Stop устанавливает состояние сервиса указывать на остановку в ожидании и вызывает метод OnStop. После приложение остановлено, сервис состояние установлено как остановленное. Если приложение является размещенным сервисом, домен приложения выгружен.

Здесь есть одно важное предостережение: учетная запись пользователя, под которой работает служба, должна иметь разрешение на остановку служб (это тема для ServerFault ).

Как только метод OnStart службы завершится, он продолжит работу (ничего не делая), пока что-то не скажет ему остановиться одним из следующих способов:

3 голосов
/ 21 августа 2009

Если это служба Win32 (т.е. написана на C или C ++), то вы просто вызываете SetServiceStatus (SERVICE_STOPPED) и возвращаетесь из ServiceMain.

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

0 голосов
/ 21 августа 2009

вот что я сделал в похожей ситуации.

Служба Windows работает круглосуточно и обрабатывает рабочие единицы. он получает рабочие единицы через представление базы данных.

Таблица сообщений
ProcessingStartTime
CompletionDTE
...

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

0 голосов
/ 21 августа 2009

Есть ли причина, по которой имеет в качестве службы Windows? Если нет, то следуйте решению @Macros. Однако, если это так, то зачем останавливать службу? Если вы остановите его, то его нужно будет просто перезапустить, когда письма будут отправлены. Судя по вашему описанию, это не похоже на то, что для этого потребовалось бы много ресурсов, поэтому я бы посоветовал просто установить его и запустить, запускать раз в месяц для отправки электронных писем.

0 голосов
/ 21 августа 2009

net stop [service_name] ... в командной строке тоже сделает это.

Но я согласен со всеми остальными; Похоже, что планировщик заданий Windows будет лучше отвечать вашим потребностям.

0 голосов
/ 21 августа 2009

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

Чтобы ответить на оригинальный вопрос, вы можете получить список текущих запущенных сервисов в C #

services = System.ServiceProcess.ServiceController.GetServices();

Затем найдите тот, который вам нужен, и установите статус «остановлено»

locatedService.Status == ServiceControllerStatus.Stopped

Полный пример в MSDN

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