Попытка получить информацию об использовании процессора и сети из системного монитора - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь получить информацию об использовании процессора и сети из процесса.
В моем примере я буду использовать процесс chrome

Вот как я вызываю метод, используя IEnumerable<String>

foreach (string p in GetProcessStatistics(new string[] { "chrome" }))
{
  Console.WriteLine(p);
}

А вот и метод.

    private static IEnumerable<String> GetProcessStatistics(String[] processesTosearch)
    {
        Process[] processList = Process.GetProcesses();

        foreach (string process in processesTosearch)
        {
            foreach (Process p in processList)
            {
                if (p.ProcessName == process)
                {
                    StringBuilder sb = new StringBuilder();
                    PerformanceCounter CPUperformanceCounter = new PerformanceCounter("Process", "% Processor Time", p.ProcessName);
                    double cpuData = CPUperformanceCounter.NextValue();
                    PerformanceCounter NETWORKperformanceCounter = new PerformanceCounter("Process", "IO Data Operations/Sec", p.ProcessName);
                    double networkData = NETWORKperformanceCounter.NextValue();

                    sb.AppendLine("ID: " + p.Id.ToString());
                    sb.AppendLine("NAME: " + p.ProcessName);
                    sb.AppendLine("CPU USAGE: " + cpuData);
                    sb.AppendLine("RAM USAGE: " + ConvertToReadableSize(p.PrivateMemorySize64));
                    sb.AppendLine("NETWORK USAGE: " + networkData);
                    yield return sb.ToString();
                }
            }
        }
    }

А вот вывод одного из результатов

ID: 17624
NAME: chrome
CPU USAGE: 0
RAM USAGE: 23.2MB
NETWORK USAGE: 0

Когда я смотрю на системный монитор, значения процессора и сети не равны 0, однако в консоли они равны.

Из некоторых исследований я понимаю, что значения никогда не будут идеальными, но почему они показывают 0 в консольном приложении, а не вмонитор производительности?

Ответы [ 2 ]

0 голосов
/ 21 июня 2018

Мне нравится решение Джеффа, но я хотел получить среднее.Было несколько проблем с загрузкой процессора, которые, казалось, должны были быть легко решаемыми, но я их не видел.

Во-первых, конечно, значение 0 в первом запросе бесполезно.Поскольку вы уже знаете, что первый ответ равен 0, почему функция не учитывает это и возвращает true .NextValue ()?

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

Мое решение состояло в том, чтобы сделать цикл for, который циклически проходит и дает вам среднее значение за последние несколько секунд.Вы можете настроить счетчик так, чтобы он был короче или длиннее (если он больше 2).

public static float ProcessorUtilization;

public static float GetAverageCPU()
{
    PerformanceCounter cpuCounter = new PerformanceCounter("Process", "% Processor Time", Process.GetCurrentProcess().ProcessName);
    for (int i = 0; i < 11; ++i)
    {
        ProcessorUtilization += (cpuCounter.NextValue() / Environment.ProcessorCount);
    }
    // Remember the first value is 0, so we don't want to average that in.
    Console.Writeline(ProcessorUtilization / 10); 
    return ProcessorUtilization / 10;
}
0 голосов
/ 12 июня 2018

Вам понадобится как минимум два чтения для каждого счетчика, с интервалом не менее секунды, чтобы получить пригодное для чтения значение.

При необходимости измените порядок, но вам нужно будет сделать что-то вроде этого:

private static IEnumerable<String> GetProcessStatistics(String[] processesTosearch)
{
    Process[] processList = Process.GetProcesses();

    foreach (string process in processesTosearch)
    {
        foreach (Process p in processList)
        {
            if (p.ProcessName == process)
            {
                StringBuilder sb = new StringBuilder();
                PerformanceCounter CPUperformanceCounter = new PerformanceCounter("Process", "% Processor Time", p.ProcessName);
                PerformanceCounter NETWORKperformanceCounter = new PerformanceCounter("Process", "IO Data Operations/Sec", p.ProcessName);

                // set a baseline
                CPUperformanceCounter.NextValue();
                NETWORKperformanceCounter.NextValue();

                Thread.Sleep(1000);

                double cpuData = CPUperformanceCounter.NextValue();
                double networkData = NETWORKperformanceCounter.NextValue();

                sb.AppendLine("ID: " + p.Id.ToString());
                sb.AppendLine("NAME: " + p.ProcessName);
                sb.AppendLine("CPU USAGE: " + cpuData);
                sb.AppendLine("RAM USAGE: " + ConvertToReadableSize(p.PrivateMemorySize64));
                sb.AppendLine("NETWORK USAGE: " + networkData);
                yield return sb.ToString();
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...