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 ...");
}