我正在尝试基于每分钟在C#中创建一个自定义性能计数器。
到目前为止,我看到只有RateOfCountsPerSecond32或RateOfCountsPerSecond64可用。
有人知道基于每分钟创建自定义计数器的选项是什么?
答案 0 :(得分:3)
不会直接支持此功能。您必须自己计算每分钟的速率,然后使用NumberOfItems32或NumberOfItems64计数器来显示速率。使用诸如“计数/分钟”之类的有用名称将清楚地表明该值是什么。你每分钟都会更新一次。背景(工人)线程是一个很好的地方。
或者,您可以依赖监控软件。使用NumberOfItems32 / 64计数器,但让监控软件按分钟计算。 Windows内置的PerfMon工具不会这样做,但没有理由不这样做。
答案 1 :(得分:2)
默认情况下,PerfMon每秒都会提取数据。为了在Windows性能监视器图表中获得永久性图像,我编写了自定义计数器,用于测量每分钟计数率。 工作一分钟后,我会从柜台收到数据。 请注意,准确性对我来说并不重要。
代码段如下所示:
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());
}
}