C# - 性能计数器低于Taskmanager%

时间:2015-08-06 13:44:09

标签: c# cpu-usage

我尝试创建一个可以从pc获取不同用法的类,我遇到的问题是CPU使用率低于任务管理器显示的值(大约10%)。

你能看一眼并指出我正确的方向吗?没有解释就没有答案,我想学习!

以下是我的主题:

using System.Diagnostics;
using System.Net.NetworkInformation;

namespace ConsoleApplication2
{
    class UsageFetcher
    {
        ulong totalRAM;

        PerformanceCounter cpuUsage;
        PerformanceCounter ramUsage;
        PerformanceCounter diskUsage;

        NetworkInterface[] networkUsage;

        public UsageFetcher()
        {
            // Fetching total amount of RAM to be able to determine used persantage
            //totalRAM = new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory;
            totalRAM = this.getTotalRam();

             // Creating a new Perfromance Counter who will be used to get the CPU Usage
            cpuUsage = new PerformanceCounter();

            // Setting it up to fetch CPU Usage 
            cpuUsage.CategoryName = "Processor";
            cpuUsage.CounterName = "% Processor Time";
            cpuUsage.InstanceName = "_Total";

            /*
             * Fetching the first two reads
             * First read is always 0 so we must elimiate it
             */
            cpuUsage.NextValue();
            cpuUsage.NextValue();

            // Creating a new Performance Counter who will be used to get the Memory Usage
            ramUsage = new PerformanceCounter();

            // Setting it up to fetch Memory Usage
            ramUsage.CategoryName = "Memory";
            ramUsage.CounterName = "Available Bytes";

            // Fetching the first two reads !! Same reason as above !!
            ramUsage.NextValue();
            ramUsage.NextValue();
        }

        public string getCPUUsage()
        {
            /* 
             * Requesting the usage of the CPU
             * It is returned as a float thus I need to call ToString()
             */
            return cpuUsage.NextValue().ToString();
        }

        public string getMemUsage()
        {
            // Requesting memory usage and calculate how much is free
            return (100 -ramUsage.NextValue() / totalRAM * 100).ToString();
        }

        public ulong getTotalRam()
        {
            return new Microsoft.VisualBasic.Devices.ComputerInfo().TotalPhysicalMemory ;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

根据此SO帖子:Why the cpu performance counter kept reporting 0% cpu usage?

你需要为NextValue()方法至少休眠一秒钟才能返回一个不错的结果。

尝试在调用NextValue之间添加对Sleep的调用,看看你得到了什么。