【问题标题】:c# calculate CPU usage for a specific applicationc# 计算特定应用程序的 CPU 使用率
【发布时间】:2010-11-19 15:19:03
【问题描述】:

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

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

【问题讨论】:

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

标签: c# process cpu-usage


【解决方案1】:

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

小示例代码给你的想法:

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 用于其他计数器。

【讨论】:

  • 你知道这是否可以适应进程 ID 或句柄吗?原因是可能有多个进程正在运行,而我只对监控其中一个特定的进程感兴趣。
  • 在多核机器上,您必须将性能计数器的值除以处理器(或内核)的数量。 pct = pct / Environment.ProcessorCount。否则,您可能会得到超过 100% 的值
  • 第 142 天。仍在寻找任意键。
  • 我发布的答案结合了所有方法来检索 RAM 和 CPU 使用率的正确值。包含代码。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我从几个答案(最明显的是this one)中收集了信息,并提出了以下代码,这些代码能够根据 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 非常有用的例子,试一试。但是我可以在哪里放> 之前的方法?方法之后?提前致谢!
    【解决方案4】:
    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());
                }
            }
    

    【讨论】:

      猜你喜欢
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多