CPU使用问题

时间:2013-11-27 04:30:22

标签: c# performancecounter

我已经阅读了其他一些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%一直... 任何想法为什么会这样?

2 个答案:

答案 0 :(得分:1)

根据您获取6.728499E+07%原因的更新,您正在阅读内存Private Bytes使用情况CPU Usege。因此返回的数字是资源管理器使用的专用字节数(约67,284,990字节)。如果你不希望那些大数字的科学符号传递到number formatting stringToString

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

答案 1 :(得分:0)

  

代码运行正常,但我没有得到任何输出......

不,代码没有正常运行:

  1. 由于您的异常处理,您永远不会被告知错误。
  2. 如果代码运行良好,则会产生输出。
  3. 您的代码明确忽略了导致InvalidOperationException的任何错误。有例外是有原因的,通常是告诉你有严重的错误。你应该使用的唯一一次应该忽略它们就是你真的,真的并不关心是否发生了异常。

    在您的代码中,您设置CategoryName以指示您正在查看的计数器组,但从未设置CounterName属性以指定要使用的计数器。对于Processor组,由于可能存在多个处理器。

    下一个问题,您从cpuCounter.Nextvalue()获得的第一个结果是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调用并进行自己的计算。它仍然需要两个样本,但您可以更频繁地调用它并获得合理的结果。