1

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

4

2 回答 2

0

来自MSDN

如果计数器的计算值取决于两次计数器读取,则第一次读取操作返回 0.0。

创建此类计数器后,您必须调用NextValue()两次,因为它需要在计算第一个值之前缓冲一个样本。对NextValue()的后续调用将按预期工作。

于 2012-08-29T00:39:20.663 回答
0

这是我发现通过代码返回费率的费率计数器。无论 button2_click 中的睡眠时间如何,它都会显示一个值 4,这对于“循环”代码中的 250 毫秒延迟来说是正确的。诀窍似乎是在两个样本之间比较当前和以前的原始值。

    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);
        }
    }
于 2014-07-03T15:09:12.200 回答