我正在尝试在 C# 中基于每分钟创建一个自定义性能计数器。
到目前为止,我只看到了 RateOfCountsPerSecond32 或 RateOfCountsPerSecond64 可用。
有谁知道基于每分钟创建自定义计数器的选项是什么?
我正在尝试在 C# 中基于每分钟创建一个自定义性能计数器。
到目前为止,我只看到了 RateOfCountsPerSecond32 或 RateOfCountsPerSecond64 可用。
有谁知道基于每分钟创建自定义计数器的选项是什么?
这不会被直接支持。您必须自己计算每分钟的速率,然后使用 NumberOfItems32 或 NumberOfItems64 计数器来显示速率。使用“计数/分钟”之类的有用名称可以清楚地说明值是什么。您只需每分钟更新一次计数器。后台(工作者)线程将是这样做的好地方。
或者,您可以只依赖监控软件。使用 NumberOfItems32/64 计数器,但让监控软件进行每分钟计算。Windows 中内置的 PerfMon 工具不能做到这一点,但它没有理由不能做到。
默认情况下,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());
}
}