Как остановить службу Windows программно?

Вы читали wiki FAQ затмения, Каково различие между командой и действием?

Вы, вероятно, уже понимаете, что Действия и Команды в основном делают то же самое: Они заставляют определенную часть кода выполняться. Они инициированы, главным образом, от artificats в пользовательском интерфейсе

основное беспокойство с [1 121], Действия состоят в том, что проявление и код все хранятся в Действии .
, Хотя существует некоторое разделение в Делегатах Действия, они все еще подключены к основному иску. События выбора передаются Действиям так, чтобы они могли изменить свое включенное состояние (программно) на основе текущего выбора. Это не очень изящно. Также для размещения действия с определенной частью инструментальных средств необходимо использовать несколько точек расширения.

Команды в значительной степени решают все эти проблемы. Основная идея состоит в том, что Команда является просто абстрактной идеей некоторого кода, который будет выполняться. Фактическая обработка кода сделана, ну, в общем, обработчиками . Обработчики активируются определенным состоянием инструментальных средств. Это состояние запрашивается выражениями ядра платформы. Это означает, что нам только нужна одна глобальная команда Save, которая ведет себя по-другому, на основе которого обработчик в настоящее время активен.

properties of a command

Этот статья детализирует различия

Действия :

  • UI и обработка всегда связываются . Нет никакого способа, которым можно разделить друг друга
  • , В то время как Действия могут быть внесены различным частям инструментальных средств (всплывающее меню панель/tool), все они были различные точки расширения и таким образом, Вы заканчиваете тем, что копировали XML в нескольких местах. Худший из него - то, что не все точки расширения ожидают ту же конфигурацию.
  • Действия Определения в нескольких местах кошмар обслуживания . Если необходимо изменить значок действия, необходимо измениться во всех местах.
  • Другая проблема с дублированием Действий в plugin.xml - то, что несколько инстанцируют тех же Действий, будет создан в памяти .

Команды включают больше точек расширения, но:

  • Обработчик может быть объявлен отдельно от Команды. Это включает для [1 130] несколько объявлений обработчика для той же команды .
  • , activeWhen для всех обработчиков оценен и тот, который возвращает true для наиболее особого условия, выбран. Все эти вещи обошедшиеся без ровная загрузка Вашего обработчика в памяти. Даже не загружая Ваш плагин !
  • Определение параметров является всем о возврате карты отображаемых имен & идентификаторы. Имя было бы отображено на странице привязок клавиш, и идентификатор будет использоваться для вызова команды, когда сочетание клавиш будет нажато.
  • Определяют IExecutionListener, который является просто наблюдателем выполнения команды, таким образом, оно не может ни наложить вето на нем, ни внести любые изменения в событие

6
задан cplusplusNewbie 21 August 2009 в 15:27
поделиться

7 ответов

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

0
ответ дан 8 December 2019 в 14:45
поделиться

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

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

сообщение таблицы
ProcessingStartTime
CompletionDTE
...

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

0
ответ дан 8 December 2019 в 14:45
поделиться

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

7
ответ дан 8 December 2019 в 14:45
поделиться

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

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

0
ответ дан 8 December 2019 в 14:45
поделиться

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

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

3
ответ дан 8 December 2019 в 14:45
поделиться
document.onkeydown = function(e) {
  //do what you need to do
}

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

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

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

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

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

6
ответ дан 8 December 2019 в 14:45
поделиться

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

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

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

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

locatedService.Status == ServiceControllerStatus.Stopped

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

0
ответ дан 8 December 2019 в 14:45
поделиться
Другие вопросы по тегам:

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