1

いくつかのパフォーマンス カウンターを含む Windows サービスがあります。サービスが何をしているかを監視する別のアプリケーションがあります。これには、すべてを 1 か所で見つけて利用できるようにするパフォーマンス カウンターが含まれます。ただし、RateOfCountsPerSecond32 型のパフォーマンス カウンターの 1 つに問題があるようです。Perfmon のカウンターを見ると、すべて問題ないように見えます。この特定のカウンターは妥当な値を示しますが、私の監視アプリケーションでは、カウンターは常に NextValue として 0 を提供します。

以下は、特定のカテゴリからカウンターを取得するために使用しているコードです。

        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から:

カウンターの計算値が 2 回のカウンター読み取りに依存する場合、最初の読み取り操作は 0.0 を返します。

最初の値を計算する前に 1 つのサンプルをバッファリングする必要があるため、このタイプのカウンターを作成した後、NextValue()を 2 回呼び出す必要があります。NextValue()への後続の呼び出しは、期待どおりに機能します。

于 2012-08-29T00:39:20.663 に答える
0

これは、コードを介してレートを返すレートカウンターを取得するために見つけたものです。button2_click のスリープ時間に関係なく、値 4 が表示されます。これは、「ループ」コードの 250 ミリ秒の遅延にほぼ適しています。トリックは、2 つのサンプル間で現在と以前の生の値を経時的に比較することのようです。

    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 に答える