C# Фоновый процесс загрузки процессора с использованием PerformanceCounter

Я пытаюсь загрузить процессор для фонового процесса; Фоновый процесс

Использование счетчика производительности

 PerformanceCounter ramCounter = new PerformanceCounter("Process", "Working Set", process.ProcessName);
            PerformanceCounter cpuCounter = new PerformanceCounter("Process", "% Processor Time", process.ProcessName);
            ramCounter.NextValue();
            cpuCounter.NextValue();
            while (true)
            {
                Thread.Sleep(500);
                double ram = ramCounter.NextValue();
                double cpu = cpuCounter.NextValue();
                Console.WriteLine("RAM: " + (ram / 1024 / 1024) + " MB; CPU: " + (cpu) + " %");
            }

Это хорошо работает на (приложениях), но не дает Backgorund каждый раз возвращать 0; Я не совсем понимаю; Какой правильный способ получения загрузки процессора для этих процессов?

1 ответ

На самом деле Ганс Пассант дал мне отличный намек; Таким образом, проблема не в фоновом процессе, а в наличии нескольких экземпляров с одним и тем же ProcessName. Поэтому для создания счетчика производительности вы должны получить имя экземпляра процесса по идентификатору процесса другими словами:

string processNameYourAreLookingFor ="name";
  List<Process> prc_Aspx = runningNow.Where(x => x.ProcessName == processNameYourAreLookingFor ).ToList();
foreach (Process process in prc_Aspx)
            {

                string _prcName = GetProcessInstanceName(process.Id);
                 new PerformanceCounter("Process", "% Processor Time", _prcName);}
}

И GetProcessInstanceName по идентификатору

private string GetProcessInstanceName(int pid)
        {
            PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");

            string[] instances = cat.GetInstanceNames();
            foreach (string instance in instances)
            {

                using (PerformanceCounter cnt = new PerformanceCounter("Process",
                     "ID Process", instance, true))
                {
                    int val = (int)cnt.RawValue;
                    if (val == pid)
                    {
                        return instance;
                    }
                }
            }
            throw new Exception("Could not find performance counter " +
                "instance name for current process. This is truly strange ...");
        }
Другие вопросы по тегам