このクラスを、プロセスを起動して何らかの入力を与え、プロセスがアイドル状態になるのを待ってからさらに入力を与えるテストのカテゴリの基本クラスとして使用しています。
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' は指定されたカテゴリに存在しません
パフォーマンス カウンターのインスタンス名が永続的ではないようです。
3 つの foobar プロセスがある場合、インスタンス名を持つ可能性があります
- フーバー pid 5331
- foobar #1 pid 5332
- foobar #2 pid 5333
pid 5332がfoobar #2を出るとfoobar #1になるようです。
質問:
これは文書化された動作ですか? パフォーマンス カウンターを永続化できませんか? 毎回調べないといけないの?
または、 foobarという名前のすべてのプロセスのプロセッサー時間を提供できるパフォーマンス カウンターはありますか