CPU and Memory Usage in C#

using System;
using System.Management;

namespace WMISample
{
    public class MyWMIQuery
    {
        public static void Main()
        {
            try
            {
                ManagementObjectSearcher searcher =
                    new ManagementObjectSearcher("root\\CIMV2",
                                                 "SELECT * FROM Win32_PerfFormattedData_Counters_ProcessorInformation WHERE NOT Name='_Total'");
                ManagementObjectSearcher searcher2 =
                    new ManagementObjectSearcher("root\\CIMV2",
                                                 "SELECT * FROM Win32_OperatingSystem");
                for(int c=0; c<15; c++)
                {
                    for (var i = searcher.Get().GetEnumerator(); i.MoveNext();)
                    {
                        string ts = DateTime.Now.ToString("dd-MM-yyyy HH:mm:ss.fffffff");
                        ManagementObject queryObj = (ManagementObject)i.Current;
                        Console.WriteLine("Core {0} running at {1} % on {2}", queryObj["Name"], queryObj["PercentProcessorTime"], ts);
                    }
                    for (var i = searcher2.Get().GetEnumerator(); i.MoveNext();)
                    {
                        ManagementObject queryObj = (ManagementObject)i.Current;
                        double free = Double.Parse(queryObj["FreePhysicalMemory"].ToString());
                        double total = Double.Parse(queryObj["TotalVisibleMemorySize"].ToString());
                        Console.WriteLine("Amount used: {0} GB", (total - free)/(1024*1024));
                        Console.WriteLine("Percentage used: {0}%", Math.Round(((total - free) / total * 100), 2));
                    }
                    Console.WriteLine();
                }
                Console.WriteLine("Press any key to continue . . . ");
                Console.ReadKey(true);
            }
            catch (ManagementException e)
            {
                Console.WriteLine("An error occurred while querying for WMI data: " + e.Message);
            }
        }
    }
}

This example queries Windows Management Instrumentation (WMI) from C# to read CPU and memory usage. WMI exposes performance and hardware data through query classes such as Win32_Processor and Win32_OperatingSystem, which you read with System.Management.

It is a quick way to gather system metrics inside a .NET application without third party libraries. WMI is Windows only, so for cross platform needs consider the PerformanceCounter class or operating system specific APIs.

Comments