c#计算特定应用程序的CPU使用率

我试图弄清楚如何获取特定进程的CPU使用率,但只能找到与整体 CPU使用率相关的信息。

有谁知道如何以特定应用程序的百分比方式提取当前CPU使用率?

性能计数器 – 进程 – 处理器时间百分比。

一些示例代码可以为您提供以下建议:

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); } } } } 

基于进程ID查找实例的注意事项

我不知道有什么更好的方法,希望有人这样做。 如果没有,这里有一种方法可以为给定进程ID和进程名称的进程找到正确的实例名称。

"Process"系列下还有另一个称为"ID Process"性能计数器(PC)。 它返回实例的PID。 因此,如果您已经知道名称(即“chrome”或“myapp”),则可以测试每个实例,直到找到PID的匹配项。

每个实例的命名都很简单:“myapp”“myapp#1”“myapp#2”……等等。

 ... new PerformanceCounter("Process", "ID Process", appName, true); 

一旦PC的值等于PID,您就找到了正确的appName 。 然后,您可以将该appName用于其他计数器。

一种在不使用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); } } } } 

您可以遍历进程以选择哪一个,或者如果您已经知道id,只需使用此命令而不是GetProcessesByName()

 Process p = Process.GetProcessById(123); 

我已经从几个答案(最明显的是这个答案)中编译了信息,并提出了以下代码,这些代码能够根据Windows提供的性能计数器信息获取有关当前进程的CPU和RAM使用情况的信息:

 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; } 

实例名称确定没有任何黑客或猜测,我也在关注多个核心。

检索到的信息与我在VS中的进程资源管理器和性能窗口中看到的信息一致。

 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()); } }