1分あたりに基づいてC#でカスタムパフォーマンスカウンターを作成しようとしています。
これまでのところ、RateOfCountsPerSecond32またはRateOfCountsPerSecond64のみが使用可能です。
1分あたりに基づいてカスタムカウンターを作成するためのオプションを知っている人はいますか?
1分あたりに基づいてC#でカスタムパフォーマンスカウンターを作成しようとしています。
これまでのところ、RateOfCountsPerSecond32またはRateOfCountsPerSecond64のみが使用可能です。
1分あたりに基づいてカスタムカウンターを作成するためのオプションを知っている人はいますか?
これは直接サポートされません。自分で 1 分あたりのレートを計算し、NumberOfItems32 または NumberOfItems64 カウンターを使用してレートを表示する必要があります。「カウント/分」のようなわかりやすい名前を使用すると、値が何であるかが明確になります。毎分カウンターを更新するだけです。バックグラウンド (ワーカー) スレッドは、それを行うのに適した場所です。
または、監視ソフトウェアに依存することもできます。NumberOfItems32/64 カウンターを使用しますが、監視ソフトウェアに 1 分ごとの計算を行わせます。Windows に組み込まれている PerfMon ツールはこれを行いませんが、できない理由はありません。
デフォルトでは、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());
}
}