2013-11-27 30 views
0

我已经阅读了一些其他CPU使用问题,但我坚持为什么我的代码不工作。CPU使用问题

我在From1的名为“ComputerPerformance”的单独类中有代码。

class 
{ 
    private string cCpuUtilization; 

    public void cpuUtilization() 
    { 
     try 
     { 
     PerformanceCounter cpuCounter; 
     cpuCounter = new PerformanceCounter(); 
     cpuCounter.CategoryName = "Processor"; 
     cCpuUtilization = cpuCounter.NextValue() + "%"; 
     } 
     catch(System.InvalidOperationException e) 
     { 
     } 
    } 

    public String getCPUUtilization() 
    { 
     return cCpuUtilization; 
    } 
} 

的代码运行正常,但我得到什么作为输出...

更新

现在,该代码如下所示:

PerformanceCounter cpuCounter = new PerformanceCounter(); 
cpuCounter.CategoryName = "Process"; 
cpuCounter.CounterName = "Private Bytes"; 
cpuCounter.InstanceName = "Explorer"; 
cCpuUtilization = cpuCounter.NextValue().ToString() + "%"; 

我的问题现在它是返回值:6.728499E + 07%... 任何想法,为什么会这样?

+3

摆脱那个try/catch块,也许你会发现什么是错的。 –

+0

我刚刚这样做,它出现了错误: 在System.dll中发生未处理的类型'System.InvalidOperationException异常' 其他信息:由于缺少CounterName而未能初始化。 不知道这是什么意思... –

+4

这意味着“CounterName”属性没有设置。也许看看文档。并且不要隐藏自己的例外。 –

回答

1

根据你为什么得到6.728499E+07%的更新,以及你正在阅读的内存Private Bytes使用不是CPU Usege。所以返回的数字是浏览器使用的私有字节数(约为67,284,990字节)。如果你不想scientfic符号对于那些大量传递一个number formatting stringToString

cCpuUtilization = cpuCounter.NextValue().ToString("N0") + " bytes"; //Should now print "67,284,990 bytes" 
0

The code runs fine, but I am getting nothing as an output...

否,代码不罚款不运行:

  1. 你永远不会由于您的异常处理而被告知错误。
  2. 如果代码运行良好那么它会产生输出。

您的代码明确忽略导致InvalidOperationException的任何错误。有例外的原因,通常是告诉你有什么严重的错误。你应该使用的唯一时间应该忽略它们,当你真的时,真的不关心发生了异常。

在你的代码设置CategoryName,表示你看哪个柜台的组,但从来没有设置CounterName属性来指定计数器使用。而在Processor组的情况下,由于可能有多个处理器。

下一个问题,您从cpuCounter.Nextvalue()得到的第一个结果是groving为0.0。总是。方法NextValue从计数器获取样本,并将其与最后一个样本进行比较以计算实际值。必须这样做需要两个电话NextValue之间的延迟,以获得有效的结果。这个延迟至少应该是一秒钟。

下面是一些代码,修复了几个问题:

public class CPUTime : IDisposable 
{ 
    private PerformanceCounter counter; 
    private DateTime lastcheck; 
    private float lastvalue; 

    public float Value 
    { 
     get 
     { 
      if ((DateTime.Now - lastcheck).TotalMilliseconds > 950) 
      { 
       lastvalue = counter.NextValue(); 
       lastcheck = DateTime.Now; 
      } 
      return lastvalue; 
     } 
    } 

    public CPUTime() 
    { 
     counter = new PerformanceCounter("Processor", "% Processor Time", "_Total", true); 
     counter.NextValue(); 
     lastcheck = DateTime.Now; 
    } 

    ~CPUTime() 
    { 
     Dispose(); 
    } 

    public void Dispose() 
    { 
     if (counter != null) 
     { 
      counter.Dispose(); 
      counter = null; 
     } 
    } 

    public override string ToString() 
    { 
     return string.Format("{0:0.00}%", Value); 
    } 
} 

如果这还不够快你 - 它每秒只更新一次,毕竟 - 那么你就需要使用GetSystemTimes API打电话,做你自己的计算。它仍然需要两个样本,但您可以更频繁地调用它并获得合理的结果。