我必须在这里做错事。我创建了一个自定义性能计数器,如下所示:
string counterCategory = "Test Category";
string counterName = "Test Counter";
if (!PerformanceCounterCategory.Exists(counterCategory))
{
Console.WriteLine("Creating Counters");
CounterCreationDataCollection counterCreationDataCollection =
new CounterCreationDataCollection();
counterCreationDataCollection.Add(
new CounterCreationData(counterName,
"Description",
PerformanceCounterType.NumberOfItems32)
);
PerformanceCounterCategory.Create(counterCategory,
"My category description/Help",
PerformanceCounterCategoryType.SingleInstance,
counterCreationDataCollection);
}
计数器类别和计数器在性能监视器中创建并可查看。
然后我尝试更改计数器的值
PerformanceCounter myCounter =
new PerformanceCounter(counterCategory, counterName, false);
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Setting to "+i);
myCounter.RawValue = i;
Thread.Sleep(200);
}
myCounter.Close();
然而,当我坐下来观看性能监视器中的计数器没有任何反应时,值永远不会改变。
那么我做错了什么?
如果我添加对nextValue()或rawValue()的调用,则返回的值将按照我的预期返回,但Windows性能监视器仍显示扁平线,例如
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Setting to "+i);
myCounter.IncrementValue()
Console.WriteLine("Next Value = "+myCounter.RawValue());
Thread.Sleep(200);
}
编辑:我发现如果我关闭性能监视器,然后重新打开它而不删除计数器,那突然意识到它有一个新值。因此值正在设置和持久化,但性能监视器不会看到更改。
答案 0 :(得分:2)
跟进是有序的。无论如何,在Win7下,似乎性能监视器可能无法按预期工作。当我编写测试代码时,我在创建计数器后暂停了应用程序,以便启动性能监视器。一旦我让它继续,监视器永远不会改变它的计数器,尽管底层计数器被更改。
如果我退出性能监视器并重新启动它,将显示测试程序中的最后一个计数器值,表明它已正确设置。如果我再次运行测试程序,只需更改值,性能监视器将最终获得更改。
因此,正如所有人指出的那样,代码是正确的,Windows性能监视器是行为不端的。
谢谢大家的答案!
答案 1 :(得分:1)
您在测试过程中是否可以更改计数器名称?您的代码不会验证该类别是否包含您的计数器 - 它仅检查该类别是否存在,如果存在,则不会创建该类别。
如果您在第一次创建类别后更改了计数器名称,则新的计数器将不存在于类别中,并且在性能监视器中查看时,您可能会错过计数器名称的细微差别。 / p>
答案 2 :(得分:0)
您的代码看起来不错。从我的工作示例中,唯一的区别是我在设置RawValue后调用increment方法。
PerformanceCounter myCounter =
new PerformanceCounter(counterCategory, counterName, false);
for (int i = 0; i < 10; i++)
{
Console.WriteLine("Setting to "+i);
myCounter.Increment();
Thread.Sleep(200);
}
myCounter.Close();