2016-09-15 4 views
0

Я пытаюсь получить загрузку процессора для фонового процесса; Background processC# Фоновый процесс загрузки процессора с использованием 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) + " %"); 
      } 

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

+0

проверки в этом примере. http://www.codeproject.com/Articles/10258/How-to-get-CPU-usage-of-processes-and-threads – active92

+0

Существует несколько экземпляров этого процесса, все с тем же именем. Итак, какой из них вы фактически контролируете? http://stackoverflow.com/a/9115662/17034 –

+0

Я бегу бросаю все из них, и результат такой же нагрузки 0 cpu; 'Список prc = runningNow.Where (x => x.ProcessName == txtApp.Text) .ToList(); foreach (Процесс процесса в prc) {..' – MultyPulty

ответ

0

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

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 ..."); 
     } 
Смежные вопросы