2

1分あたりに基づいてC#でカスタムパフォーマンスカウンターを作成しようとしています。

これまでのところ、RateOfCountsPerSecond32またはRateOfCountsPerSecond64のみが使用可能です。

1分あたりに基づいてカスタムカウンターを作成するためのオプションを知っている人はいますか?

4

2 に答える 2

3

これは直接サポートされません。自分で 1 分あたりのレートを計算し、NumberOfItems32 または NumberOfItems64 カウンターを使用してレートを表示する必要があります。「カウント/分」のようなわかりやすい名前を使用すると、値が何であるかが明確になります。毎分カウンターを更新するだけです。バックグラウンド (ワーカー) スレッドは、それを行うのに適した場所です。

または、監視ソフトウェアに依存することもできます。NumberOfItems32/64 カウンターを使用しますが、監視ソフトウェアに 1 分ごとの計算を行わせます。Windows に組み込まれている PerfMon ツールはこれを行いませんが、できない理由はありません。

于 2009-06-27T00:50:46.260 に答える
2

デフォルトでは、PerfMon は毎秒データを取得します。Windows パフォーマンス モニター チャートで永続的なイメージを取得するために、1 分あたりのカウント率を測定するためのカスタム カウンターを作成しました。1分間作業した後、カウンターからデータを受信します。精度は私にとって重要ではないことに注意してください。

コード スニペットは次のようになります。

class PerMinExample
{
    private static PerformanceCounter _pcPerSec;
    private static PerformanceCounter _pcPerMin;
    private static Timer _timer = new Timer(CallBack, null, TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1));
    private static Queue<CounterSample> _queue = new Queue<CounterSample>();

    static PerMinExample()
    {
        // RateOfCountsPerSecond32
        _pcPerSec = new PerformanceCounter("Category", "ORDERS PER SECOND", false);

        // NumberOfItems32
        _pcPerMin = new PerformanceCounter("Category", "ORDERS PER MINUTE", false);
        _pcPerSec.RawValue = 0;
        _pcPerMin.RawValue = 0;
    }

    public void CountSomething()
    {
        _pcPerSec.Increment();
    }

    private static void CallBack(Object o)
    {
        CounterSample sample = _pcPerSec.NextSample();

        _queue.Enqueue(sample);
        if (_queue.Count <= 60)
            return;

        CounterSample prev = _queue.Dequeue();

        Single numerator = (Single)sample.RawValue - (Single)prev.RawValue;
        Single denomenator = 
            (Single)(sample.TimeStamp - prev.TimeStamp) 
            / (Single)(sample.SystemFrequency) / 60;
        Single counterValue = numerator / denomenator;

        _pcPerMin.RawValue = (Int32)Math.Ceiling(counterValue);

        Console.WriteLine("ORDERS PER SEC: {0}", _pcPerSec.NextValue());
        Console.WriteLine("ORDERS PER MINUTE: {0}", _pcPerMin.NextValue());
    }
}
于 2015-11-04T13:18:14.140 に答える