Я использую этот класс в качестве базового класса для категории тестов, которые запускают процесс и дают ему некоторый ввод, и ждут, пока он перестанет работать, прежде чем давать ему больше ввода.
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");
}
}
Эти тесты иногда терпят неудачу, потому что PerfCounter.NextValue()
выдает
System.InvalidOperationException Экземпляр "foobar # 2" не существует в указанной категории
Кажется, что имя экземпляра счетчика производительности не является постоянным.
Если есть три процесса foobar, они могут иметь имена экземпляров
- foobar pid 5331
- foobar # 1 pid 5332
- foobar # 2 pid 5333
Кажется, что если pid 5332 выходит из foobar # 2, становится foobar # 1.
Вопросы:
-
Является ли это документированным поведением? Можете ли вы не настойчивый счетчик производительности? Вам нужно каждый раз искать его?
-
В качестве альтернативы есть счетчик производительности, который может дать Время процессора для всех процессов с именем foobar