为什么我的绩效计数器不会改变?

为什么我的绩效计数器不会改变?

问题描述:

我必须在这里做一些非常错误的事情。我创建一个自定义性能计数器如下:创建为什么我的绩效计数器不会改变?

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

编辑:我发现,如果我关闭性能监视器,然后重新打开它而不删除柜台,突然就意识到有一个新的价值。所以这些值正在设置并持续存在,但性能监视器没有看到这些更改。

跟进是为了。无论如何,在Win7下看来,性能监视器可能无法按预期工作。当我编写测试代码时,我在创建计数器后暂停了应用程序,以启动性能监视器。一旦我让它继续,监视器永远不会改变它的计数器,尽管潜在的计数器正在改变。

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

所以,正如所有人指出的那样,代码是错误的Windows性能监视器。

谢谢大家的回答!

+0

或者在我的情况下,重新启动。 – 2014-08-24 10:14:49

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

不,仍然是一个平坦的线,我害怕,用Increment()和设置RawValue。 – blowdart 2009-09-21 18:35:36

+0

有趣。在午休期间将考察它。 – Dejan 2009-09-22 07:21:00

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

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

+0

这是一个不错的主意,但是我在运行这个之前删除了类别,因此它会被重新创建,然后类别名称和计数器名称将保存在用于创建和打开计数器的字符串中。 – blowdart 2009-09-21 19:04:25

+1

这是一个大型项目的一部分吗?当我从问题中提取代码并将其包装在控制台项目的'static void Main(string [] args)'方法中时,它可以不加修改地工作。我需要运行两次,一次创建类别,以便我可以在性能监视器中找到它,然后再次观察值的更改。 – GBegen 2009-09-21 19:17:27

+0

这是在一个控制台应用程序(和一个网页设置原始值的乐趣)。我最终关闭了性能监视器并再次打开它,并且突然看到了这些变化。这可能是因为它不喜欢在创建计数器后才进行监视。 – blowdart 2009-09-21 19:25:43