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

问题描述 投票:19回答:4

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

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

c# process cpu-usage
4个回答
34
投票

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

很少的示例代码为您提供了这个想法:

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和进程名称的进程找到正确的实例名称。

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

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

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

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


4
投票

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

2
投票

我已经从几个答案(最明显的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中的进程资源管理器和性能窗口中看到的信息一致。


0
投票
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());
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.