Sto utilizzando questa classe come classe base per una categoria di test che avvia un processo e gli diamo un input e attendi che diventi inattivo prima di dargli più input.Il nome dell'istanza del contatore delle prestazioni di un processo può cambiare anche se il processo non è terminato
public abstract class TestProcessLaunchingBase
{
protected PerformanceCounter PerfCounter { get; set; }
protected void WaitForProcessIdle()
{
while (true)
{
float oldValue = PerfCounter.NextValue();
Thread.Sleep(1000);
float nextValue = PerfCounter.NextValue();
if (nextValue == 0)
break;
}
}
protected void FindSpawnedProcessPerfCounter(int processId)
{
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 == processId)
{
PerfCounter = new PerformanceCounter("Process", "% Processor Time", instance);
break;
}
}
}
Assert.IsNotNull(PerfCounter, "Failed to perf counter");
}
}
Questi test di tanto in tanto vengono a mancare perché PerfCounter.NextValue()
genera
System.InvalidOperationException grado 'foobar # 2' non esiste nella Categoria specificata
Sembra che il nome dell'istanza del contatore delle prestazioni non è persistente.
se ci sono tre processi foobar potrebbero avere nomi di istanza
- foobar pid 5331
- foobar # 1 pid 5332
- foobar # 2 pid 5333
Sembra che se pid 5332 uscite foobar n. 2 diventa foobar n. 1.
Domande:
È questo un comportamento documentato? Non riesci a mantenere un contatore di prestazioni? Devi cercare ogni volta?
In alternativa, c'è un contatore delle prestazioni che può dare Tempo processore per tutti i processi denominati foobar
P/Invoke: 'GetProcessTimes' fornisce i tempi di modalità utente e kernel per un determinato processo. Prima è necessario ottenere un handle di processo con 'OpenProcess', e sicuramente non cambierà se si chiude un'altra istanza di questa applicazione. –