2

I try to make a class which will fetch different usages from the pc, the problem that I have atm is that the CPU usage is under what Task Manager displays (with about 10%).

Can you please have a look and point me in the right direction ? Please no answers without explanation, I want to learn !

Here is what I have atm :

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 Answers1

0

According to this SO post here: Why the cpu performance counter kept reporting 0% cpu usage?

You need to sleep for at least a second for the NextValue() method to return a decent result.

Try adding a call to Sleep between your calls to NextValue and see what you get.

Community
  • 1
  • 1
Doug Dawson
  • 1,254
  • 2
  • 21
  • 37