为什么我的表演台不会改变?

时间:2009-09-21 18:25:22

标签: c# performancecounter

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

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

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

3 个答案:

答案 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();