2012-08-29 36 views
1

我有一個Windows服務,它有一些性能計數器。我有另一個應用程序來監視服務在做什麼,包括性能計數器的方式,一切都在一個地方找到和可用。不過,我似乎遇到類似RateOfCountsPerSecond32類型的性能計數器的問題。如果我看Perfmon上的計數器一切似乎都很好,這個特定的計數器會給出一個合理的值,但是在我的監視應用程序中,計數器始終提供0作爲NextValue。性能計數器 - 似乎得到正確的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

MSDN

如果計數器的計算值取決於兩個計數器讀取,所述第一讀取操作返回0.0。

你必須調用NextValue()兩次創建該類型的計數器後,因爲它需要計算它的第一個值之前緩衝一個樣本。後續撥打NextValue()將按預期工作。

+0

所以這坐落在一個循環,進行一次第二...但不論我讓多久運行它總是說0 – Zholen

+0

必須在同一呼叫** NextValue()**兩次PerformanceCounter對象使其工作。我擔心你每次在你的循環中調用** NextValue()**時都會創建新的PerformanceCounter實例。 –

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