6

我一定在这里做错了什么。我创建了一个自定义性能计数器,如下所示:

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);
}

编辑:我发现如果我关闭性能监视器然后重新打开它而不删除计数器,它会突然意识到有一个新值。因此,这些值正在设置并保持不变,但是性能监视器看不到更改。

4

3 回答 3

2

后续行动是有序的。无论如何,在 Win7 下,性能监视器似乎无法按预期工作。当我编写测试代码时,我在创建计数器后暂停了应用程序,以便启动性能监视器。一旦我让它继续,监视器就永远不会改变它的计数器,尽管底层计数器被改变了。

如果我然后退出性能监视器并重新启动它,将显示测试程序中的最后一个计数器值,表明它设置正确。如果我然后再次运行测试程序,只是更改值,性能监视器最终会接受更改。

因此,正如每个人都指出的那样,代码是正确的,是 Windows 性能监视器行为不端。

谢谢大家的答案!

于 2009-09-22T09:07:49.927 回答
1

在您的测试过程中是否有可能更改了计数器名称?您的代码不会验证类别是否包含您的计数器 - 它仅检查类别是否存在,如果存在,则不会创建类别。

如果您在第一次创建类别后更改了计数器名称,那么您的新计数器将不存在于该类别中,并且您在性能监视器中查看时可能会忽略计数器名称的细微差别。

于 2009-09-21T19:01:01.420 回答
0

你的代码看起来不错。从我的工作示例中,唯一的区别是我在设置 RawValue 后调用了增量方法。

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();
于 2009-09-21T18:32:04.800 回答