2009-09-21 18 views
5

私はここで何か非常に間違っている必要があります。パフォーマンスカウンターが変更されないのはなぜですか?

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メソッド()、または私は予想通りとは値が返されますが、Windowsのパフォーマンスモニタはまだ、例えばフラットなラインを示しrawValue()の呼び出しを追加した場合

for (int i = 0; i < 10; i++) 
{ 
    Console.WriteLine("Setting to "+i); 
    myCounter.IncrementValue() 
    Console.WriteLine("Next Value = "+myCounter.RawValue()); 
    Thread.Sleep(200); 
} 

編集:私はパフォーマンスモニタを閉じてから、カウンターを削除せずに、それを再度開く場合は、その突然、それは新しい価値があります実現していることがわかりました。したがって、値は設定されており、永続化されますが、パフォーマンスモニタでは変更が表示されません。

答えて

2

フォローアップが順調です。とにかくWin7では、パフォーマンスモニタが期待通りに動作しないことがあります。テストコードを書いたときに、パフォーマンスモニタを開始するために、カウンタを作成した後にアプリケーションを一時停止しました。私はそれを続行させると、元のカウンタが変更されているにもかかわらず、モニタは決して変更されませんでした。私は、パフォーマンスモニタを終了し、それをテストプログラムの最後のカウンタ値を再起動した場合

は、それが正しく設定されていたことを示す、表示されました。テストプログラムを実行して値を変更するだけで、パフォーマンスモニタが最終的に変更を取得します。

だから、誰もが示されているようにコードは、それがふらちな事をして、Windowsのパフォーマンスモニタだった、が正しいです。

は、あなたの答えありがとうございました!

+0

私の場合は、再起動してください。 –

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(); 
+0

インクリメント(といいえ、私は怖いまだフラットライン)とRawValueを設定しています。 – blowdart

+0

おかしい。昼休み中にそれを調べます。 – Dejan

1

カウンタの名前を変更した可能性はありますか?コードではカテゴリにカウンタが含まれているかどうかは検証されません。カテゴリが存在するかどうかだけを確認し、存在する場合はカテゴリを作成しません。

カテゴリの最初の作成以降にカウンタ名が変更された場合、新しいカウンタはカテゴリに存在せず、パフォーマンスモニタでカウンタを確認するときにカウンタの名前に若干の違いがないことがあります。

+0

いいアイデアですが、これを実行する前にカテゴリを削除していますので、再作成され、カテゴリ名とカウンタ名の両方が作成およびカウンタのオープンに使用される文字列に保持されます。 – blowdart

+1

このプロジェクトの一部ですか?あなたのコードを質問から取り出して、コンソールプロジェクトの 'static void Main(string [] args)'メソッドでラップすると、変更なしで動作しました。私はそれを2回、カテゴリーを作成するために1回は実行する必要があったので、パフォーマンスモニターでそれを見つけることができました。 – GBegen

+0

これは、コンソールアプリケーションにありました(楽しいWebページで生の値を設定するため)。パフォーマンスモニタを閉じてもう一度開くと、突然変更が見えました。カウンタが作成された直後のモニタリングは好きではないかもしれません。 – blowdart