2009-08-21 6 views
6

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

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

ответ

7

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

+0

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

+1

Если вы новичок в этом, тогда самое подходящее время, чтобы выглядеть хорошо и подходить к лицам, принимающим решения, с предложением Макроса. Услуги не используются раз в месяц, они непрерывны. В случае, о котором вы упомянули, очень просто вывести код из службы Windows и в консольное приложение. – MattH

3

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

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

0

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

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

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

Тогда обратите внимание на тот, который вы хотите и установить статус для остановлен

locatedService.Status == ServiceControllerStatus.Stopped 

Полный пример on msdn

0

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

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

6

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

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

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

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

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

  • Programatically, позвонив по телефону Stop внутри самого или от службы a внешний процесс using the method Colin Gravill describes in his answer.
  • Через командную строку.
  • Через панель управления «Службы» панели управления компьютером.
0

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

0

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

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

стол Сообщение
  ProcessingStartTime
  CompletionDTE вид
  ...

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

Смежные вопросы