隐藏

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

发布:2022/11/10 11:48:26作者:管理员 来源:本站 浏览次数:716

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


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

相关讨论


   添加了一些有关基于PID查找实例的信息


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


小样代码让您明白:



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...\

");

           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" ...等。

1


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


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

相关讨论


   您知道这是否适合处理进程ID或处理吗? 原因是因为可能正在运行多个进程,而我只想监视其中的一个特定进程。

   在多核计算机上,您必须将性能计数器的值除以处理器(或内核)的数量。 pct = pct Environment.ProcessorCount。 否则,您可能会获得超过100%的值

   第142天。仍在寻找任何钥匙。

   我已经发布了答案,该答案结合了所有方法来检索RAM和CPU使用率的正确值。 包含代码。


一种不使用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...\

");

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

1


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中的流程浏览器和性能窗口中看到的信息一致。

相关讨论


   嗨@shytikov非常有用的示例,然后尝试。 但是我可以在该方法之前放在哪里? 之后的方法? 提前致谢!




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

           }

       }