Счетчик производительности - Кажется, не удается получить правильное значение NextValue

У меня есть служба 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)


person Zholen    schedule 29.08.2012    source источник


Ответы (2)


Из MSDN:

Если вычисленное значение счетчика зависит от двух чтений счетчика, первая операция чтения возвращает 0,0.

Вы должны вызвать NextValue () дважды после создания этого типа счетчика, потому что ему необходимо буферизовать одну выборку перед вычислением ее первого значения. Последующие вызовы NextValue () будут работать должным образом.

person Thomas C. G. de Vilhena    schedule 29.08.2012
comment
Таким образом, это находится в цикле и выполняется один раз в секунду ... но независимо от того, как долго я позволяю ему работать, он всегда говорит 0. - person Zholen; 29.08.2012
comment
Вы должны дважды вызвать NextValue () для одного и того же объекта PerformanceCounter, чтобы он заработал. Боюсь, что вы создаете новые экземпляры PerformanceCounter каждый раз, когда вызываете NextValue () в этом вашем цикле. - person Thomas C. G. de Vilhena; 30.08.2012

Вот что я нашел, чтобы получить счетчик ставок для возврата ставки через код. Независимо от времени ожидания в 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);
        }
    }
person Tim H    schedule 03.07.2014