Загруженность процессора для процесса C#
Был тут недавно небольшой заказ: необходимо получить загруженность процессора и памяти для каждого процесса на C#. По сути дела аналог диспетчера задач, встроенного в Windows. Задача оказалась простой, но с небольшой хитростью. Итак, давайте научимся получать данные о процессе на C# с помощью NET.
Выглядит все проще некуда. Берем класс PerformanceCounter и читаем описание:
Компонент PerformanceCounter может использоваться как для чтения существующих предопределенных или пользовательских счетчиков, так и для публикации (записи) данных производительности в пользовательские счетчики.
Этот тип реализует интерфейс IDisposable. Когда вы закончите использовать тип, вы должны избавиться от него прямо или косвенно. Чтобы избавиться от типа напрямую, вызовите его метод Dispose в блоке try/catch. Чтобы избавиться от него косвенно, используйте языковую конструкцию, такую как using (в C#) или Using (в Visual Basic).
Счетчик (PerformanceCounter) - это механизм сбора данных о производительности. В реестре хранятся имена всех счетчиков, каждый из которых относится к определенной области функциональности системы. Примеры включают время занятости процессора, использование памяти или количество байтов, полученных через сетевое подключение.
Каждый счетчик однозначно идентифицируется по его имени и местоположению. Таким же образом, как путь к файлу включает диск, каталог, один или несколько подкаталогов и имя файла, информация о счетчике состоит из четырех элементов: компьютер, категория, экземпляр категории и имя счетчика.
Информация счетчика должна включать категорию или объект производительности, для которых счетчик измеряет данные. Категории компьютера включают физические компоненты, такие как процессоры, диски и память. Существуют также системные категории, такие, как процессы и потоки. Каждая категория связана с функциональным элементом внутри компьютера и имеет набор стандартных счетчиков, назначенных ему. Эти объекты перечислены в раскрывающемся списке объект производительности диалогового окна добавление счетчиков в системном мониторе Windows 2000, и их необходимо включить в путь счетчика. Данные о производительности группируются по категориям, к которым они относятся.
В некоторых случаях может существовать несколько копий одной и той же категории. Например, несколько процессов и потоков выполняются одновременно, а некоторые компьютеры содержат более одного процессора. Копии категорий называются экземплярами категорий, и каждому экземпляру присваивается набор стандартных счетчиков. Если категория может иметь более одного экземпляра, спецификация экземпляра должна быть включена в информацию счетчика.
Чтобы получить данные о производительности для счетчиков, которым требуется начальное или предыдущее значение для выполнения необходимых вычислений, дважды вызовите метод NextValue и используйте возвращенную информацию в соответствии с требованиями приложения.
Хватит теории, давайте пример.
Process[] processlist = Process.GetProcesses(); foreach (Process theprocess in processlist) { ramCounter = new PerformanceCounter("Process", "Working Set", theprocess.ProcessName); double ram = ramCounter.NextValue(); Console.WriteLine("Process: {0} ID: {1} Ram: {2}", theprocess.ProcessName, theprocess.Id, ram); } Console.ReadKey();Вот, в переменной ram будет храниться память, используемая процессом. Получится что-то типа этого.
Но вот если мы таким же образом попробуем узнать загруженность процессора определённым процессом, то получим всегда нули.
cpuCounter = new PerformanceCounter("Process", "% Processor Time", item.ProcessName);Почему? Метод nextValue() для процессора всегда возвращает значение 0 при первом вызове. Поэтому вы должны вызвать этот метод во второй раз. Или в третий. Чтобы корректно узнать, можно сделать, например, так:
cpuCounter = new PerformanceCounter("Process", "% Processor Time", item.ProcessName); double cpu = 0; double ram = ramCounter.NextValue(); for (int i=0; i<5;i++){ cpu = cpuCounter.NextValue(); if (cpu != 0) break; }То есть пять раз определяем загруженность процессора и если она не равна нулю, то выходим из цикла.
Если вам требуется помощь по C#, то вы можете написать мне. За небольшую сумму я вам помогу.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.
Читайте также:
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.