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

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

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

Можно вручную добавить в код экземпляры класса PerformanceCounter либо использовать приложение Visual Studio.NET Designer. С его помощью перетаскиваются компоненты PerformanceCounter из панели инструментов на его рабочую поверхность. Поддержку легко добавить в библиотеку компонентов, выводя класс из System.ComponentModel.Component. Метод InitializeComponent(), который используется для задания свойств компонентов, будет исполняться автоматически, необходимо добавить лишь его вызов.

Добавление компонентов PerformanceCounter

Далее можно добавить компоненты PerformanceCounter из панели инструментов. Для нашей службы добавляется четыре экземпляра, где свойство CategoryName задается как Quote Service Count для всех объектов, а свойство CounterName задается одним из значений, доступным в выбранной категории. Свойство ReadOnly должно быть задано как False.

Код, который был внесен в InitializeComponent() путем добавления Components в конструктор и заданием свойств, выглядит так:

private void InitializeComponent() {

 // ...

 //

 // performanceCounterRequestsPerSec

 //

 this.performanceCounterRequestsPerSec.CategoryName =

  "Quote Service Counts";

 this.performanceCounterRequestsPerSec.CounterName =

  "# of Requests / sec";

 this.performanceCounterRequestsPerSec.ReadOnly = false;

 //

 // performanceCounterBytesSentTotal

 //

 this.performanceCounterBytesSentTotal.CategoryName =

  "Quote Service Counts";

 this.performanceCounterBytesSentTotal.CounterName =

  "# of Bytes sent";

 this.performanceCounterBytesSentTotal.ReadOnly = false;

 //

 // performanceCounterBytesSentPerSec

 //

 this.performanceCounterBytesSentPerSec.CategoryName =

  "Quote Service Counts";

 this.performanceCounterBytesSentPerSec.CounterName =

  "# of Bytes sent / sec";

 this.performanceCounterBytesSentPerSec.ReadOnly = false;

 //

 // performanceCounterRequestsTotal

 //

 this.performanceCounterRequestsTotal.CategoryName =

  "Quote Service Counts";

 this.performanceCounterRequestsTotal.CounterName =

  "# of Requests";

 this.performanceCounterRequestsTotal.Readonly = false;

 // ...

Счетчики производительности, которые показывают общие значения, увеличиваются в методе Listener() класса QuoteServer. Метод Increment() увеличивает счетчик на 1, метод IncrementBy() увеличивает счетчик на значение аргумента.

Для счетчиков производительности, которые показывают посекундные значения, в методе Listener() обновляются только две переменные — requestPerSec и bytessPerSec:

void protected void Listener() {

 try {

  listener = new TCPListener(port);

  listener.Start();

  while (true) {

   Socket socket = listener.Accept();

   if (socket == null) {

    return;

   }

   string message = GetRandomQuoteOfTheDay();

   UnicodeEncoding encoder = new UnicodeEncoding();

   byte [] buffer = encoder.GetBytes(message);

   socket.Send(buffer, buffer.Length, 0);

   socket.Close();

   performanceCounterRequestsTotal.Increment();

   performanceCounterBytesSentTotal.IncrementBy(nBytes);

   requestsPerSec++;

   bytesPerSec += Bytes;

  }

 } catch (Exception e) {

  string message = "Quote Server failed in Listener: " + e.Message;

  eventLog.WriteEntry(message, EventLogEntryType.Error);

 }

}

Чтобы показывать обновленные значения каждую секунду, используется компонент Timer. Метод OnTimer() вызывается раз в секунду и задает счетчики производительности с помощью свойства RawValue класса PerformanceCounter:

protected void OnTimer(object sender, system.EventArgs e) {

 performanceCounterBytesSentPerSec.RawValue = bytesPerSec;

 performanceCounterRequestsPerSec.RawValue = reguestsPerSec;

 bytesPerSec = 0;

 requestsPerSec = 0;

}

perfmon.exe

Теперь можно контролировать нашу службу. Утилита Performance может запускаться из Administrative Tools|Performance. Нажимая кнопку + в панели инструментов, можно добавить счетчики производительности. Quote Service будет определяться как объект производительности. Все сконфигурированные счетчики показаны в списке счетчиков:

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

Служба счетчика производительности

Если не существует ссылки на объект счетчика производительности, и объект был удален сборщиком мусора, счетчик этого объекта теряется и запускается в следующий раз с 0. Чтобы решить эту проблему, состояние можно хранить в службе счетчиков производительности. С помощью .NET Framework служба счетчиков производительности устанавливается в системе. Необходимо только запустить службу; можно также сконфигурировать службу для автоматического запуска во время начальной загрузки системы.

Свойства служб Windows 2000

Windows 95, 98 и ME не поддерживают службы Windows. Они поддерживаются в Windows NT, Windows 2000 и Windows ХР. Windows 2000 имеет несколько больше свойств для служб по сравнению с Windows NT. Рассмотрим свойства служб в Windows 2000.

Изменения сетевого соединения и события электропитания

В Windows 2000 не требуется, чтобы система перезагружалась так часто, как это было необходимо в Windows NT; например, не нужно перезагружать систему, когда изменяется адрес IP, — служба получает события при смене адреса и действует соответственно. Windows 2000 посылает следующие управляющие коды службам, когда изменяется сетевое соединение:

Управляющий код SERVICE_CONTROL_NETBINDADD Доступен новый компонент для соединения. SERVICE_CONTROL_NETBINDREMOVE Компонент для соединения был удален. Необходимо заново считать информацию соединения и отсоединиться от удаленного компонента. SERVICE_CONTROL_NFTBINDENABLED Ранее отключенное соединение снова включено. SERVICE_CONTROL_NETBINDDISABLE Ранее включенное соединение теперь отключено.

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

Windows 2000 добавляет также увеличенную поддержку управления электропитанием. Существует поддержка для перевода системы в нерабочее состояние — память записывается на диск, поэтому возможна более быстрая начальная загрузка системы. Также возможно временно остановить машину, чтобы сократить потребление электроэнергии, при этом система в случае необходимости автоматически пробуждается.

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

Классы в пространстве имен System.ServiceProcess также имеют поддержку для этих свойств Windows 2000 Служба конфигурируется так, чтобы она реагировала на события паузы и продолжении с помощью свойства CanPauseAndContinue, и задается свойство для управления электропитанием: CanHandlePowerEvent. Службы Windows 2000, которые управляют электропитанием, регистрируются в SCM с помощью метода API Win32 RegisterServiceCtrlHandlerEx().

Задавая значение CanHandlePowerEvent как True, метод

protected virtual bool OnPowerEvent(PowerBroadcastStatus power Status);

будет вызываться, как только изменится статус электропитания. Некоторые из значений, получаемые из PowerBroadcastStatus, перечислены ниже в таблице:

Значение powerStatus Описание BatteryLow Слабый заряд батареи. Необходимо сократить функционирование службы до минимума. PowerStatusChange Произошло переключение электропитания от батареи на внешний источник, или мощность батареи опустилась ниже допустимого значения и т.д. QuerySuspend Полномочия системных запросов перешли в приостановленный режим. Можно отказаться от полномочий или приготовиться к переходу в приостановленный режим, закрывая файлы, разъединяя сетевые соединения и т.д. QuerySuspendFailed Переход в приостановленный режим был отвергнут системой. Можно продолжать с той же функциональностью. Suspend Никто не отменил запрос перехода в приостановленный режим. Система скоро будет приостановлена.

Восстановление

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