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 に答える