2010-05-30 103 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,所以在上面的注释中链接的其他线程可能会让你有大部分的方式。