I'm trying to figure out how to get the CPU usage for a particular process but can only find information relating to overall CPU usage.
Does anyone know how to extract the current CPU usage in percentage terms for a specific application?
I'm trying to figure out how to get the CPU usage for a particular process but can only find information relating to overall CPU usage.
Does anyone know how to extract the current CPU usage in percentage terms for a specific application?
Performance Counters - Process - % Processor Time.
Little sample code to give you the idea:
using System;
using System.Diagnostics;
using System.Threading;
namespace StackOverflow
{
class Program
{
static void Main(string[] args)
{
PerformanceCounter myAppCpu =
new PerformanceCounter(
"Process", "% Processor Time", "OUTLOOK", true);
Console.WriteLine("Press the any key to stop...\n");
while (!Console.KeyAvailable)
{
double pct = myAppCpu.NextValue();
Console.WriteLine("OUTLOOK'S CPU % = " + pct);
Thread.Sleep(250);
}
}
}
}
Notes for finding the instance based on Process ID:
I do not know of any better way, and hopefully somebody does. If not, here is one way you can find the right instance name for your process given the Process ID and process name.
There is another Performance Counter (PC) called "ID Process"
under the "Process"
family. It returns the PID for the instance. So, if you already know the name (i.e. "chrome" or "myapp"), you can then test each instance until you find the match for the PID.
The naming is simple for each instance: "myapp" "myapp#1" "myapp#2" ... etc.
... new PerformanceCounter("Process", "ID Process", appName, true);
Once the PC's value equals the PID, you found the right appName
. You can then use that appName
for the other counters.
pct = pct / Environment.ProcessorCount
. Otherwise, you may get values over 100% –
Afteryears Thread.Sleep
suspends the thread (it "hangs"). Better use Task.Delay
. Is it always bad to use Thread.Sleep()? –
Yawl A method to calculate processor usage for a single process without using PerformanceCounter.
using System;
using System.Diagnostics;
namespace cpuusage
{
class Program
{
private static DateTime lastTime;
private static TimeSpan lastTotalProcessorTime;
private static DateTime curTime;
private static TimeSpan curTotalProcessorTime;
static void Main(string[] args)
{
string processName = "OUTLOOK";
Console.WriteLine("Press the any key to stop...\n");
while (!Console.KeyAvailable)
{
Process[] pp = Process.GetProcessesByName(processName);
if (pp.Length == 0)
{
Console.WriteLine(processName + " does not exist");
}
else
{
Process p = pp[0];
if (lastTime == null || lastTime == new DateTime())
{
lastTime = DateTime.Now;
lastTotalProcessorTime = p.TotalProcessorTime;
}
else
{
curTime = DateTime.Now;
curTotalProcessorTime = p.TotalProcessorTime;
double CPUUsage = (curTotalProcessorTime.TotalMilliseconds - lastTotalProcessorTime.TotalMilliseconds) / curTime.Subtract(lastTime).TotalMilliseconds / Convert.ToDouble(Environment.ProcessorCount);
Console.WriteLine("{0} CPU: {1:0.0}%",processName,CPUUsage * 100);
lastTime = curTime;
lastTotalProcessorTime = curTotalProcessorTime;
}
}
Thread.Sleep(250);
}
}
}
}
You could loop through the processes to pick which one, or if you already know the id, simply use this command instead of GetProcessesByName()
Process p = Process.GetProcessById(123);
I have compiled information from several answers (most noticeably this one) and come up with following code that able to get information about current process's CPU and RAM usage based on performance counter information provided by Windows:
public object GetUsage()
{
// Getting information about current process
var process = Process.GetCurrentProcess();
// Preparing variable for application instance name
var name = string.Empty;
foreach (var instance in new PerformanceCounterCategory("Process").GetInstanceNames())
{
if (instance.StartsWith(process.ProcessName))
{
using (var processId = new PerformanceCounter("Process", "ID Process", instance, true))
{
if (process.Id == (int)processId.RawValue)
{
name = instance;
break;
}
}
}
}
var cpu = new PerformanceCounter("Process", "% Processor Time", name, true);
var ram = new PerformanceCounter("Process", "Private Bytes", name, true);
// Getting first initial values
cpu.NextValue();
ram.NextValue();
// Creating delay to get correct values of CPU usage during next query
Thread.Sleep(500);
dynamic result = new ExpandoObject();
// If system has multiple cores, that should be taken into account
result.CPU = Math.Round(cpu.NextValue() / Environment.ProcessorCount, 2);
// Returns number of MB consumed by application
result.RAM = Math.Round(ram.NextValue() / 1024 / 1024, 2);
return result;
}
Instance name determined without any hacks or guesses, I'm also taking care about multiple cores.
Information retrieved is inline with information I see in process explorer and performance window in VS.
Based on shytikov's answer but asynchronous and await-able - uses Task.Delay instead of Thread.Sleep to avoid blocking the thread.
private async Task<dynamic> GetUsageAsync()
{
var process = Process.GetCurrentProcess();
var name = string.Empty;
foreach (var instance in new PerformanceCounterCategory("Process").GetInstanceNames())
{
if (instance.StartsWith(process.ProcessName))
{
using var processId = new PerformanceCounter("Process", "ID Process", instance, true);
if (process.Id == (int)processId.RawValue)
{
name = instance;
break;
}
}
}
var cpu = new PerformanceCounter("Process", "% Processor Time", name, true);
var ram = new PerformanceCounter("Process", "Private Bytes", name, true);
cpu.NextValue();
ram.NextValue();
await Task.Delay(500);
dynamic result = new ExpandoObject();
result.CPU = Math.Round(cpu.NextValue() / Environment.ProcessorCount, 2);
result.RAM = Math.Round(ram.NextValue() / 1024 / 1024, 2); // MB
return result;
}
Usage
dynamic result = await GetUsageAsync();
string stats = $"Memory Usage: {result.RAM} MB, CPU Usage: {result.CPU}%";
PerformanceCounter ProcessCPUCounter = new PerformanceCounter();
ProcessCPUCounter.CategoryName = "Process";
ProcessCPUCounter.CounterName = "% Processor Time";
ProcessCPUCounter.InstanceName = "TestServiceName";
ProcessCPUCounter.ReadOnly = true;
t3 = new Timer();
t3.Tick += new EventHandler(ProcessCPUThread); // Everytime t3 ticks, th2_Tick will be called
t3.Interval = (1000) * (1); // Timer will tick evert second
t3.Enabled = true; // Enable the t3
t3.Start();
private void ProcessCPUThread(object sender, EventArgs e)
{
try
{
Int32 processCPU = Convert.ToInt32( ProcessCPUCounter.NextValue());
tbCPUperPrcocess.Text = Convert.ToString(processCPU / Environment.ProcessorCount);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString());
}
}
© 2022 - 2025 — McMap. All rights reserved.