2010-05-30 65 views
5

如何在C#中獲得每個內核(quadcore cpu)的CPU負載?如何獲得C#中每個核心的CPU負載?

謝謝:)

+0

[如何獲得在C#中的CPU使用情況?(HTTP的可能重複:// stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c) – chakrit 2010-05-30 12:39:17

+1

看到了,但那是全球負載,我需要PER核心。 – JustFogMaxi 2010-05-30 12:40:27

+0

我找到了它: http://www.codegain.com/articles/csharp/windowsforms/how-to-display-processor-usage-of-dual-core-processors.aspx – JustFogMaxi 2010-05-30 13:08:32

回答

7

您可以使用WMI或System.Diagnostics命名空間。從那裏你可以抓住任何你想要的性能計數器(但是它需要一秒(1-1.5秒)來初始化那些 - 讀取值正常,只有初始化很慢)

代碼可以看起來像這樣:

using System.Diagnostics; 

    public static Double Calculate(CounterSample oldSample, CounterSample newSample) 
    { 
     double difference = newSample.RawValue - oldSample.RawValue; 
     double timeInterval = newSample.TimeStamp100nSec - oldSample.TimeStamp100nSec; 
     if (timeInterval != 0) return 100*(1 - (difference/timeInterval)); 
     return 0; 
    } 

    static void Main() 
    { 
     var pc = new PerformanceCounter("Processor Information", "% Processor Time"); 
     var cat = new PerformanceCounterCategory("Processor Information"); 
     var instances = cat.GetInstanceNames(); 
     var cs = new Dictionary<string, CounterSample>(); 

     foreach (var s in instances) 
     { 
      pc.InstanceName = s; 
      cs.Add(s, pc.NextSample()); 
     } 

     while (true) 
     { 
      foreach (var s in instances) 
      { 
       pc.InstanceName = s; 
       Console.WriteLine("{0} - {1:f}", s, Calculate(cs[s], pc.NextSample())); 
       cs[s] = pc.NextSample(); 
      } 
      System.Threading.Thread.Sleep(500); 
     } 
    } 

重要的是,你不能依靠本地.NET計算100nsInverse性能計數器(僅適用於0或100對我的回報...錯誤?),但你必須自己進行計算,併爲你需要的檔案每個實例的最後一個CounterSamples的實例(實例代表一個核心或這些核心的總和)。

似乎有對這些實例的命名convetion:

0,0 - 第一CPU第一芯 0,1 - 第一CPU第二芯 0,_Total - 第一CPU _Total的總負載 - 總所有CPU的負載

(未驗證 - 不建議依靠它,直到進一步的調查做)......

0

由於內核顯示爲單獨的CPU到操作系統,您使用相同的代碼,你會使用,以確定在多處理器機器每個CPU的負荷。一個這樣的例子(在C中)是here。請注意,它使用WMI,所以在上面的註釋中鏈接的其他線程可能會讓你有大部分的方式。

相關問題