Загруженность процессора для процесса 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 - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, си шарп, .NET




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Признание
Manifest v3 и пример расширения для браузеров на основе Chromium
Несколько советов по SEO для веб-разработчиков