Одним из наиболее важных компонентов операционной системы Windows являются службы. Это фактически автономные приложения, которые не имеют графического интерфейса и выполняют различные задачи в фоновом режиме. Службы могут быть запущены при старте операционной системы или в любой момент жизни пользователя. Обычными примерами служб являются различные веб-серверы, которые в фоновом режиме прослушивают соединения на определенных портах и взаимодействуют с ними при наличии соединений. Они также могут быть различными помощниками обновления для других установленных программ, которые подключаются к серверу, чтобы узнать, есть ли более новая версия приложения. В общем, вы можете открыть панель "Службы", чтобы увидеть все установленные и запущенные службы.
Давайте рассмотрим, как создавать собственные службы на C#. Создайте службу, которая отслеживает изменения каталогов в файловой системе. Создайте службу для его запуска.
Сначала создайте новый проект типа WindowsService. Назовем проект FileWatcherService.
Затем Visual Studio создаст проект со всем необходимым. В принципе, вам не обязательно выбирать проект такого типа, но вы можете создать проект библиотеки классов и определить в нем все необходимые вам классы.
Таким образом, ваш новый проект будет выглядеть следующим образом
Существует также файл Program.cs, содержащий фактический узел service1.cs.
Эта служба является обычным приложением, но она не работает в одиночку. Все служебные вызовы и доступы обрабатываются диспетчером управления услугами (SCM). Когда служба запускается автоматически или вручную при старте системы, SCM вызывает метод Main класса Program.
Метод Main по умолчанию определен для одновременного запуска нескольких служб, определенных в таблице ServicesToRun. Однако по умолчанию проект содержит только одну службу, Service1. Сама служба запускается с помощью метода Run ServiceBase.Run (ServicesToRun).
Сама запускаемая служба представлена узлом Service1.cs. Однако на самом деле это не простой файл кода. При открытии этого узла отображается файл Service1.Designer.cs и класс Service1.
Класс Service1 фактически представляет сервис. По умолчанию он имеет следующий код.
Класс службы должен наследоваться от базового класса ServiceBase. Этот класс определяет несколько методов, наиболее важными из которых являются метод OnStart(), запускающий действие, выполняемое службой, и метод OnStop(), останавливающий службу.
Когда SCM регистрирует службу, вызывая метод Main, служба вызывается напрямую, выполняя метод OnStart.
Если служба остановлена путем отправки команды через консоль обслуживания или командную строку, SCM вызывает метод OnStop для остановки службы.
В дополнение к этим двум методам, многие другие методы базового класса ServiceBase могут быть переопределены в классе сервиса
OnPause: вызывается, когда служба приостанавливается
OnContinue: вызывается, когда служба возобновляется после приостановки.
OnShutdown: вызывается, когда Windows выключается
OnPowerEvent: вызывается при изменении режима питания
OnCustomCommand: вызывается, когда служба получает пользовательскую команду от диспетчера управления службами (SCM).
Метод InitializeComponent () вызывается в конструкторе класса Service1, определенного в Service1.Designer.cs.
Единственное, что следует отметить, это то, что он устанавливает имя службы (свойство ServiceName).
Это имя, которое появляется в консоли служб при установке службы. Его можно изменить или оставить как есть.
Затем измените код услуги следующим образом
Базовый класс, в котором заключена вся функциональность, — это класс Logger. Он использует объект FileSystemWatcher для отслеживания изменений в папке D://Temp. Метод Start() указывает, что изменения должны отслеживаться через объект FileSystemWatcher. Все задания выполняются до тех пор, пока переменная с булевым значением истинна. Метод Stop() также может быть использован для остановки класса.
Событие FileSystemWatcher можно использовать для отслеживания всех изменений в контролируемой папке. Это гарантирует, что изменения в файле templog.txt будут занесены в журнал. Чтобы избежать конфликтов ресурсов в файле templog.txt, в котором регистрируются изменения, процесс регистрации блокируется блокировкой-заглушкой (obj).
В результате после создания, изменения, переименования и удаления файл журнала содержит следующее
В самом классе Service1 в конструкторе определено несколько опций.
В методе OnStart () вызывается новый поток для запуска объекта Logger.
Новый поток необходим потому, что текущий поток обрабатывает только команды SCM и должен как можно быстрее вернуться из метода OnStart.
Когда команда на остановку службы поступает от менеджера SCM, срабатывает метод OnStop и вызывается метод logger.Stop(). Дополнительная задержка позволяет остановить поток протоколирования.
Однако сам класс обслуживания еще не достаточен. Вам все равно нужно создать программу установки службы.
