- Фантастика и фэнтези
- Ироническое фэнтези
- Стимпанк
- Детективная фантастика
- Киберпанк
- Попаданцы
- LitRPG
- Космоопера
- Технофэнтези
- Городская фантастика
- Русское фэнтези
- Юмористическая фантастика
- Космическая фантастика
- Боевое фэнтези
- Эпическая фантастика
- Зарубежная фантастика
- Книги магов
- Мистика
- Разная фантастика
- Разное фэнтези
- Любовное фэнтези
- Романтическая фантастика
- Городское фентези
- Историческая фантастика
- Историческое фэнтези
- Социально-философская фантастика
- Сказочная фантастика
- Иностранное фэнтези
- Романтическое фэнтези
- Ироническая фантастика
- Ужасы и Мистика
- Постапокалипсис
- Героическая фантастика
- Фэнтези
- Научная Фантастика
- Социально-психологическая
- Альтернативная история
- Боевая фантастика
- Разная литература
- Пословицы, поговорки
- Шахматы
- Визуальные искусства
- Фанфик
- Авто и ПДД
- Военное
- Отраслевые издания
- Гиды, путеводители
- Зарубежная образовательная литература
- Военная история
- Цитаты из афоризмов
- Современная литература
- Великолепные истории
- Начинающие авторы
- Современная зарубежная литература
- Боевые искусства
- Изобразительное искусство, фотография
- Кино
- Литература 19 века
- Недвижимость
- Музыка, музыканты
- Готические новеллы
- Истории из жизни
- Культура и искусство
- Спецслужбы
- Зарубежная прикладная литература
- Музыка, танцы
- Подростковая литература
- Прочее
- Военная техника, оружие
- Газеты и журналы
- Периодические издания
- Домоводство, Дом и семья
- Любовные романы
- Экономическая литература
- Научные и научно-популярные книги
- О животных
- Биохимия
- Культурология
- Юриспруденция
- Политика
- Психотерапия
- Языкознание
- Научпоп
- Медицина
- Психология, личное
- Радиотехника
- Филология
- Педагогика
- Образовательная литература
- Деловая литература
- Физика
- Науки: разное
- Химия
- Воспитание детей, педагогика
- Детская психология
- Зарубежная публицистика
- Биология
- Архитектура
- Зарубежная психология
- Науки о космосе
- Социология
- Математика
- География
- Беременность, ожидание детей
- Литературоведение
- Транспорт, военная техника
- Обществознание
- Зоология
- География
- Альтернативная медицина
- Иностранные языки
- Ветеринария
- Рефераты
- Астрология
- Биофизика
- Экология
- История Европы
- Учебники
- Шпаргалки
- Государство и право
- Ботаника
- Религиоведение
- История
- Техническая литература
- Прочая научная литература
- Психология
- Детективы и Триллеры
- Справочная литература
- Проза
- Новелла
- Юмор
- Проза
- Историческая проза
- Русская современная проза
- Советская классическая проза
- Повести
- Очерки
- Эссе
- Рассказы
- Зарубежная современная проза
- Сентиментальная проза
- Зарубежная классика
- Афоризмы
- Эпистолярная проза
- Феерия
- Семейный роман/Семейная сага
- Разное
- Антисоветская литература
- Магический реализм
- Русская классическая проза
- Современная проза
- О войне
- Контркультура
- Классическая проза
- Поэзия, Драматургия
- Детская литература
- Детская фантастика
- Детские остросюжетные
- Детские стихи
- Детские приключения
- Внеклассное чтение
- Учебная литература
- Зарубежные детские книги
- Бизнес
- Загадки
- Книги для подростков
- Школьные учебники
- Детский фольклор
- Книги для дошкольников
- Детские детективы
- Детская познавательная и развивающая литература
- Буквари
- Прочая детская литература
- Сказка
- Детская проза
- Детская образовательная литература
- Юмор
- Документальные книги
- Бизнес
- Внешнеэкономическая деятельность
- Тайм-менеджмент
- Кадровый менеджмент
- О бизнесе популярно
- Управление, подбор персонала
- Бизнес
- Менеджмент и кадры
- Продажи
- Экономика
- Ценные бумаги и инвестиции
- Малый бизнес
- Делопроизводство, офис
- Корпоративная культура, бизнес
- Банковское дело
- Финансы
- Зарубежная деловая литература
- Ораторское искусство / риторика
- Личные финансы
- Интернет-бизнес
- Поиск работы
- Государственное и муниципальное управление
- Бухучет и аудит
- Работа с клиентами
- Менеджмент
- Краткое содержание
- Личная эффективность
- Переговоры
- Приключения
- Старинная литература
- Религия и духовность
- Компьютеры и Интернет
- Блог
Читаем без скачивания 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 Никто не отменил запрос перехода в приостановленный режим. Система скоро будет приостановлена.Восстановление