KnigaRead.com/
KnigaRead.com » Компьютеры и Интернет » Программирование » Симон Робинсон - C# для профессионалов. Том II

Симон Робинсон - C# для профессионалов. Том II

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Симон Робинсон, "C# для профессионалов. Том II" бесплатно, без регистрации.
Перейти на страницу:

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

protected void buttonCommand_Click(object sender, System.EventArgs e) {

 Cursor Current = Cursors.WaitCursor;

 ServiceController controller =

 (ServiceController)listBoxServices.SelectedItem;

 if (sender == this.buttonStart) {

  controller.Start();

  controller.WaitForStatus(ServiceControllerStatus.Running);

 }  else if (sender == this.buttonStop) {

  controller.Stop();

  controller.WaitForStatus(ServiceControllerStatus.Stopped);

 } else if (sender == this.buttonPause) {

  controller.Pause();

  controller.WaitForStatus(ServiceControllerStatus.Paused);

 } else if (sender == this.buttonContinue) {

  controller.Continue();

  controller.WaitForStatus(ServiceControllerStatus.Running);

 }

 int index = listBoxService.SelectedIndex;

 RefreshServiceList();

 listBoxServices.SelectedIndex = index;

 Cursor.Current = Cursors.Default;

}


protected void buttonExit_Click(object sender, System.EventArgs e) {

 Application.Exit();

}


protected void buttonRefresh_Click(object sender, System.EventArgs e) {

 RefreshServiceList();

}

Это действие может потребовать некоторого времени, поэтому курсор в первой инструкции переключается в курсор ожидания. С помощью метода WaitForStatus() мы ожидаем максимум только 10 с, пока служба изменит статус на запрошенное значение. После этого времени информация в окне списка обновляется, и выбирается та же служба, чтобы выводился новый статус этой службы.

Выполняющееся приложение выглядит так:

Поиск неисправностей

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

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

□ Службу нельзя запустить из отладчика, но отладчик можно присоединить к выполняющемуся процессу службы. Откройте исходный код службы и задайте точки прерывания. В меню Visual Studio.NET Debug выберите Processes и присоедините выполняющийся процесс службы.

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

Интерактивные службы

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

Никогда не открывайте диалоговые окна для служб, выполняющихся на серверной системе. Никто не ответит на это диалоговое окно.

В тех случаях, где действительно желательно взаимодействие с пользователем, можно сконфигурировать интерактивную службу. Некоторыми примерами таких интерактивных служи являются Print Spooler, который выводит для пользователя сообщения на бумаге, и служба NetMeeting Remote Desktop Sharing.

Чтобы сконфигурировать интерактивную службу, необходимо задать функцию Allow service to interact with desktop (Разрешить службе взаимодействовать с рабочим столом) в Computer Management. Это изменяет тип службы, добавляя к типу флажок SERVICE_INTERACTIVE_PROCESS.

Регистрация событий

Службы могут сообщать об ошибках и другую информацию, отмечая ее в журнале событий. Служебный класс, производный из ServiceBase, автоматически регистрирует события, когда свойство AutoLog задано как true. Класс ServiceBase проверяет это свойство и заносит запись в журнал при событиях запуска, остановки, паузы и продолжения. Вот пример журнальной записи, сделанной службой.

Для регистрации специальных событий можно использовать классы из пространства имен System.Diagnostics.

Архитектура регистрации событий

По умолчанию Event Log (Журнал событий) хранится в трех файлах журналов: Application, Security и System. Просматривая конфигурацию реестра службы регистрации событий, можно увидеть три записи в HKLMSystemCurrentControlSetServicesEventLog с конфигурациями, указывающими на определенные файлы. Файл журнала System используется из драйверов системы и устройств, приложения и службы записывают в журнал Application. Security является журналом только для чтения приложений. Свойство аудита операционной системы использует журнал Security.

Можно прочитать эти события с помощью административной утилиты Event Viewer. Event Viewer запускается непосредственно из Server Explorer, входящего в Visual Studio.NET. Сделайте щелчок правой кнопкой мыши на пункте Event Logs и выберите запись Launch Event Viewer из контекстного меню:

В журнале событий будет помещена следующая информация:

□ Type может быть Information, Warning и Error. Information — это редкая успешная операция, Warning — проблема, которая не является немедленно значимой, и Error — основная проблема. Дополнительными типами являются FailureAudit и SuccessAudit, но эти типы используются только для журнала Security.

□ Date и Time показывают время, когда происходит событие.

□ Source — имя программного обеспечения, регистрирующего событие. Source для журнала Application конфигурируется в HKLMSystemCurrentControlSetServicesEventLogApplication. Под этим ключом конфигурируется значение EventMessageFile для указания на DLL ресурса, который содержит сообщения об ошибках.

□ Category можно определить так, чтобы журналы событий фильтровались при использовании Event View.

□ Идентификатор события определяет сообщение об определенном событии.

Классы регистрации событий

Пространство имен System.Diagnostics имеет несколько классов для регистрации событий:

□ С помощью класса EventLog можно прочитать и внести записи в журнал событий, а также определить приложения как источники событий.

□ EventLogEntry является единственным входом в журнал событий. С помощью EventLogEntryCollection можно просмотреть EventLogEntry.

 Класс EventLogInstaller предназначен для установки компонента EventLog. EventLogInstaller вызывает EventLog.CreateEventSource() для создания источника событий.

С помощью EventLogTraceListener можно записать в журнал событий трассировки. Этот класс реализует абстрактный класс TraceListener.

Добавление регистрации событий

Если свойство AutoLog класса ServiceBase задано как true, то автоматически включается регистрация событий. Класс ServiceBase регистрирует информационное событие при запросах службы для запуска, остановки, паузы и продолжения. В классе ServiceInstaller создается экземпляр EventLogInstaller, чтобы сконфигурировать источник журнала событий. Этот источник журнала событий имеет такое же имя, как и служба. Для записи события используем статический метод WriteEntry() класса EventLog. Свойство Source было уже задано в классе ServiceBase:

EventLog.WriteEntry("event log message");

Этот метод регистрирует информационное событие. Если должно быть создано событие предупреждения или ошибки, то для определения этого типа используется перезагруженный метод WriteEvent():

EventLog.WriteEntry("event log message", EventLogEntryType.Warning);

EventLog.WriteEntry("event log message", EventLogEntryType.Error);

Добавление регистрации событий в другие типы приложений

Для служб класс ServiceBase автоматически добавляет свойства регистрации событий. Если желательно использовать регистрацию событий в других типах приложений, это легко делается с помощью Visual Studio.NET.

 Используйте ToolBox для добавления компонента EventLog в конструктор.

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*