Программная архитектура приложений служб
Примечание.
Эта статья не относится к размещенным службам в .NET. Последние сведения об использовании Microsoft.Extensions.Hosting.BackgroundService служб Windows и шаблоне рабочей службы см. в следующих статье:
В основе приложений-служб Windows лежит класс, наследуемый от класса System.ServiceProcess.ServiceBase. Вы можете переопределить методы из этого класса и определить функции для них, чтобы настроить поведение службы.
Ниже перечислены основные классы, используемые при создании службы:
System.ServiceProcess.ServiceBase — вы можете переопределить методы из класса ServiceBase при создании службы и определить код, чтобы обозначить функции службы в этом наследуемом классе.
System.ServiceProcess.ServiceProcessInstaller и System.ServiceProcess.ServiceInstaller — эти классы можно использовать для установки и удаления службы.
Кроме того, класс с именем ServiceController можно использовать для управления самой службой. Этот класс не используется при создании службы, но может использоваться для ее запуска и остановки, а также передачи команд и возврата последовательностей перечислений.
Определение поведения службы
В классе службы вы можете переопределить функции базового класса, которые определяют, что происходит при изменении состояния службы в диспетчере служб. Класс ServiceBase предоставляет следующие методы, которые можно переопределить, чтобы добавить пользовательское поведение.
Способ | Переопределение |
---|---|
OnStart | Укажите, какие действия должны быть выполнены при запуске службы. В этой процедуре необходимо написать код, чтобы служба выполняла требуемые задачи. |
OnPause | Укажите, что должно происходить при приостановке службы. |
OnStop | Укажите, что должно происходить при остановке службы. |
OnContinue | Укажите, что должно происходить при возобновлении нормальной работы службы после приостановки. |
OnShutdown | Укажите, что должно происходить непосредственно перед завершением работы системы, если служба запущена в это время. |
OnCustomCommand | Укажите, что должно происходить при получении службой пользовательской команды. Дополнительные сведения о пользовательских командах см. на сайте MSDN. |
OnPowerEvent | Укажите, как должна реагировать служба при получении события управления питанием, например низкого заряда батареи или операции приостановки. |
Примечание.
Эти методы представляют состояния, через которые служба проходит за время своего существования, а именно — переходы службы от одного состояния к другому. Например, служба будет отвечать на команду OnContinue только после вызова OnStart.
Есть несколько других свойств и методов, которые представляют интерес. Например:
Метод Run в классе ServiceBase. Это главная точка входа для службы. При создании службы с помощью шаблона служб Windows код вставляется в метод
Main
приложения для запуска этой службы. Этот код выглядит так:ServiceBase[] ServicesToRun; ServicesToRun = new ServiceBase[] { new Service1() }; Run(ServicesToRun);
Dim ServicesToRun() As System.ServiceProcess.ServiceBase ServicesToRun = New System.ServiceProcess.ServiceBase() {New Service1()} System.ServiceProcess.ServiceBase.Run(ServicesToRun)
Примечание.
В этих примерах используется массив типа ServiceBase. В него можно добавить каждую службу, которую содержит приложение, а затем запустить все службы одновременно. Если создается только одна служба, вы можете не использовать массив, а просто объявить и запустить новый объект, наследуемый от ServiceBase. Пример см. в руководстве по созданию служб программным способом.
Наборы свойств в классе ServiceBase. Они определяют, какие методы могут вызываться в службе. Например, если свойству CanStop задать значение
true
, в службе можно вызвать метод OnStop. Если свойству CanPauseAndContinue задать значениеtrue
, в службе можно вызвать методы OnPause и OnContinue. Если одному из этих свойств задать значениеtrue
, необходимо переопределить и реализовать обработку для соответствующих методов.
Можно также использовать компонент, называемый ServiceController, для обмена данными с существующей службой и управления ее поведением.