Возникли проблемы с отображением памяти процесса и использования процессора с использованием класса процесса c # - PullRequest
2 голосов
/ 29 апреля 2011

У меня проблемы с перечислением использования памяти и процессора процессами в C #. Я получаю сообщение об ошибке "Отказано в доступе" при попытке получить TotalProcessorTime.

Кроме того, когда я использую PeakWorkingSet64, я получаю необоснованные цифры. Например, я знаю, что steam.exe не занимает 135380992 КБ.

Есть ли лучший способ получения памяти? Моя цель - отобразить его как диспетчер задач, например 1024K.

Что касается использования процессора, я попытался запустить мой компилятор (VS2010 Professional) с правами администратора, и я нахожусь в учетной записи администратора, но я получил ту же ошибку. Также я использую 32-битные Windows, если это как-то связано с этим вопросом. Спасибо!

var processes = Process.GetProcesses();
listBox1.Items.Clear();
foreach (var process in processes)
{                
    listBox2.Items.Add(process.PeakWorkingSet64 + process.ProcessName + "");
    listBox3.Items.Add(process.TotalProcessorTime + "");
}

Ответы [ 3 ]

4 голосов
/ 29 апреля 2011

Большинство показаний обычно в байтах, а не в КБ.Кроме того, работать напрямую с классом Process сложно из-за проблем с разрешениями и привилегиями.Попробуйте вместо этого прочитать данные счетчика производительности.Вот пример функции, которая выводит различную статистику использования памяти для всех процессов (для ведения журнала она использует log4net ):

public static void LogProcessMemoryUsage()
{
    try
    {
        PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");

        string[] instanceNames = cat.GetInstanceNames();

        foreach (string name in instanceNames)
        {
            try
            {
                PerformanceCounter counter = new PerformanceCounter("Process", "Private Bytes", name, true);
                PerformanceCounter setCounter = new PerformanceCounter("Process", "Working Set", name, true);
                PerformanceCounter poolNPCounter = new PerformanceCounter("Process", "Pool Nonpaged Bytes", name, true);

                log.InfoFormat("Memory usage for process [{0}]", name);
                log.InfoFormat("\tMem Usage:       {0} KB", (setCounter.NextValue()/1024f));
                log.InfoFormat("\tVM Size:         {0} KB", (counter.NextValue()/1024f));
                log.InfoFormat("\tNon-Paged Pool:  {0} KB", (poolNPCounter.NextValue() / 1024f));
            }
            catch (Exception ex)
            {
                log.InfoFormat("Could not read memory stats for process {0}", name);
            }
        }
    }
    catch(Exception ex2)
    {
        log.Info("Cannot retrieve memory performance counter statistics");
    }
}
3 голосов
/ 29 апреля 2011

Process.PeakWorkingSet64 возвращает количество байтов, а не КБ, так что, вероятно, будет 132203 КБ или 129 МБ, это звучит более разумно?

Вы пытались запустить приложение вне VS, запустив его от имени администратора? Возможно, процесс размещения VS не работает с повышенными привилегиями и, следовательно, не позволяет вам вызывать TotalProcessorTime, я не проверял это, так что я могу быть не в курсе.

Обновление: Я только что провел быстрое тестирование, и кажется, что свойство TotalProcessorTime на самом деле пытается открыть дескриптор процесса, который даже в качестве администратора вы можете не иметь достаточных привилегий для определенных процессов. Я бы посоветовал вам использовать Windows PerformanceCounter , чтобы получить информацию, которую вы ищете.

0 голосов
/ 14 июня 2015

Запустите приложение в режиме администратора, чтобы оно ничего не сообщало о сообщении «Доступ запрещен».

Если вы используете Visual Studio, откройте Visual Studio в режиме администратора.или запустите программу в режиме администратора.

...