性能计数器 - 似乎无法获得正确的NextValue

时间:2012-08-29 00:11:11

标签: c# winforms perfmon

我有一个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)

2 个答案:

答案 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);
        }
    }