【问题标题】:Why won't my performance counters change?为什么我的性能计数器不会改变?
【发布时间】:2009-09-21 18:25:21
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# performancecounter


    【解决方案1】:

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

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

    因此,正如大家所指出的那样,代码是正确的,是 Windows 性能监视器行为不端。

    谢谢大家的回答!

    【讨论】:

    • 或者在我的情况下,重新启动。
    • @StephenKennedy 谢谢...不知道为什么但重启解决了我的问题...
    【解决方案2】:

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

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

    【讨论】:

    • 这是个好主意,但我在运行它之前删除了类别,因此它将重新创建,然后类别名称和计数器名称都保存在用于创建和打开柜台。
    • 这是一个更大项目的一部分吗?当我从问题中取出您的代码并将其包装在控制台项目的 static void Main(string [] args) 方法中时,它无需修改即可工作。我需要运行它两次,一次是为了创建类别,以便我可以在性能监视器中找到它,然后第二次是为了观察值的变化。
    • 这是在控制台应用程序中(为了好玩而设置原始值的网页)。我最终关闭了性能监视器并再次打开它,瞧,它突然看到了变化。可能是它不喜欢在创建计数器后进行监控。
    【解决方案3】:

    您的代码看起来不错。在我的工作示例中,唯一的区别是我在设置 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();
    

    【讨论】:

    • 不,恐怕仍然是一条平线,使用 Increment() 并设置 RawValue。
    • 有趣。午休时会调查一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 2013-10-29
    • 1970-01-01
    • 2019-05-22
    相关资源
    最近更新 更多