我有一个Windows服务,其中包含一些性能计数器。我有另一个应用程序监视服务正在做什么,包括性能计数器,一切都在一个地方找到并可用。但是,我似乎遇到了一个类型为RateOfCountsPerSecond32的性能计数器的问题。如果我查看Perfmon上的计数器一切似乎都很好,这个特定的计数器给出了一个合理的值,但在我的监视应用程序中,计数器总是提供0作为其NextValue。
以下是我用于从给定类别中检索计数器的代码:
PerformanceCounterCategory pcc = new PerformanceCounterCategory(comboBox1.SelectedItem.ToString());
string stats = string.Empty;
foreach (var counter in pcc.GetCounters())
{
stats += string.Format("{0}:\t {1} : {2}\r\n\r\n", counter.CounterName, counter.NextValue(), counter.RawValue );
}
lblTps.Text = stats;
这似乎只是这种特殊类型的计数器的问题。
其他人可以注意到这个有什么问题吗? (除了我应该使用StringBuilder)
答案 0 :(得分:0)
来自MSDN:
如果计数器的计算值取决于两个计数器读数,则第一个读操作返回0.0。
创建此类型的计数器后,您必须调用 NextValue()两次,因为它需要在计算第一个值之前缓冲一个样本。对 NextValue()的后续调用将按预期工作。
答案 1 :(得分:0)
这是我发现的让费率计数器通过代码返回费率。无论button2_click中的休眠时间如何,它都会显示一个值4,这对于"循环中的250ms延迟是正确的。码。诀窍似乎是比较两个样本之间的当前和之前的原始值。
private void button2_Click(object sender, EventArgs e)
{
Task.Run(() => loop());
using (PerformanceCounter pc = new PerformanceCounter("TestCounters", "RateTest", true))
{
CounterSample a = pc.NextSample();
while (true)
{
Application.DoEvents();
System.Threading.Thread.Sleep(5000);
CounterSample b = pc.NextSample();
Single deltaTime = Convert.ToSingle(b.CounterTimeStamp / b.CounterFrequency - a.CounterTimeStamp/a.CounterFrequency);
Single deltaRaw = Convert.ToSingle(b.RawValue - a.RawValue);
label1.Text = (deltaRaw / deltaTime).ToString();
b = a;
}
}
}
private void loop()
{
while (true)
{
using (PerformanceCounter pc = new PerformanceCounter("TestCounters", "RateTest", false))
{
pc.Increment();
}
System.Threading.Thread.Sleep(250);
}
}