我使用这个类作为一类测试的基类,这些测试启动一个进程并给它一些输入,并在给它更多输入之前等待它变得空闲。
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 exits foobar #2变成foobar #1。
问题:
这是记录在案的行为吗?你不能坚持一个性能计数器吗?每次都要查吗?
或者,是否有一个性能计数器可以为所有名为foobar的进程提供处理器时间