2012-02-02 24 views
24

Sto monitorando più istanze della stessa applicazione e ho bisogno di ottenere l'utilizzo della memoria e della CPU di entrambi i processi. Tuttavia, non riesco a capire un modo per utilizzare il contatore delle prestazioni e sapere quale risultato è per quale processo. Ho visto che posso aggiungere # 1 e così alla fine del nome per ottenere risultati per ciascuno, ma questo non mi dice quale è per quale processo.per ID processo anziché nome?

Come è possibile determinare ProcessId o passare l'ID di processo al contatore per ottenere il risultato per ogni processo con lo stesso nome?

PerformanceCounterCPU.CategoryName = "Process"; 
PerformanceCounterCPU.CounterName = "% Processor Time"; 
PerformanceCounterCPU.InstanceName = proc.ProcessHandle.ProcessName; 

PerformanceCounterMemory.CategoryName = "Process"; 
PerformanceCounterMemory.CounterName = "Working Set - Private"; 
PerformanceCounterMemory.InstanceName = proc.ProcessHandle.ProcessName; 
+1

Wow! Ho affrontato ** esattamente ** lo stesso numero 2 anni fa, e non ho trovato alcuna risposta in quel momento ... Aspetto troppo la risposta ora;) – ken2k

+0

Grazie Ben. sfortunatamente i problemi che ho posto in passato sono stati rari e non sono stati risolti. Ho finito per arretrare dall'usare i metodi che erano in quelle domande. – JeremyK

+0

Ken, la risposta qui sotto ha fatto il trucco – JeremyK

risposta

28

This answer a una domanda relativa potrebbe funzionare:

private static 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 ..."); 
} 
+0

Perfetto. Ho provato a utilizzare il valore grezzo in passato, tuttavia non sembrava mai corrispondere al pid. Questo ha funzionato, grazie mille. – JeremyK

+6

Per motivi di credito, questo deriva originariamente da un vecchio blog Ingo Rammer (i cui articoli mi hanno insegnato molto nei miei primi giorni .NET): http://weblogs.thinktecture.com/ingo/2004/06/getting- the-current-process-your-own-cpu-usage.html – TheXenocide

+1

Buono a sapersi. Ho accreditato la fonte da cui l'ho copiato, questo è abbastanza per me. –

0

Se non ti dispiace un cambiamento di registrazione a livello di computer, è possibile configure Windows to use the form ProcessName_ProcessID for Perf Counter instance names, piuttosto che aggiungendo # 1, # 2, ecc:

Creare DWORD HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc\Performance\ProcessNameFormat e impostare il suo valore su 2.

Se bastone con il # 1, # 2, ecc forma, attenzione che the instance name for a given process can change during the process' lifetime!

Problemi correlati