Подтвердить что ты не робот

С# вычислить использование ЦП для конкретного приложения

Я пытаюсь выяснить, как получить использование ЦП для определенного процесса, но может найти только информацию, относящуюся к использованию общего ЦП.

Кто-нибудь знает, как извлечь текущее использование ЦП в процентах для конкретного приложения?

4b9b3361

Ответ 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 CPU % = " + pct);
                Thread.Sleep(250);
            }
        }
    }
}

Заметки для поиска экземпляра на основе идентификатора процесса:

Я не знаю лучшего способа, и, надеюсь, кто-то это сделает. Если нет, то вы можете найти правильное имя экземпляра для вашего процесса с учетом идентификатора процесса и имени процесса.

В семействе "Process" есть еще один счетчик производительности (ПК) под названием "ID Process". Он возвращает PID для экземпляра. Итак, если вы уже знаете имя (т.е. "Хром" или "myapp" ), вы можете протестировать каждый экземпляр, пока не найдете совпадение для PID.

Именование прост для каждого экземпляра: "myapp" "myapp # 1" "myapp # 2"... и т.д.

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

Как только значение ПК равно PID, вы нашли правильный appName. Затем вы можете использовать этот appName для других счетчиков.

Ответ 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);
            }
        }
    }
}

Вы можете прокручивать процессы, чтобы выбрать, какой из них или если вы уже знаете идентификатор, просто используйте эту команду вместо GetProcessesByName()

Process p = Process.GetProcessById(123);

Ответ 3

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