Исключение: Экземпляр «Имя экземпляра» не существует в указанной категории - PullRequest
10 голосов
/ 29 апреля 2011

Когда я создаю и использую счетчики производительности, как это:

private readonly PerformanceCounter _cpuPerformanceCounter;
public ProcessViewModel(Process process)
        {

             _cpuPerformanceCounter = new PerformanceCounter("Process", "% Processor Time", process.ProcessName, true);
        }

public void Update()
        {
            CPU = (int)_cpuPerformanceCounter.NextValue() / Environment.ProcessorCount; // Exception
        }

... Я получаю исключение Экземпляр 'Имя экземпляра' не существует в указанной категории и не понимаю, почему.

P.S. Код

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <settings>
      <performanceCounters enabled="true"/>
    </settings>
  </system.net>
</configuration>

... включено в App.config.

Ответы [ 5 ]

1 голос
/ 09 февраля 2018

Вот мое решение для всех процессов и нескольких экземпляров процесса:

var processes = Process.GetProcesses().GroupBy(g => g.ProcessName);
        List<Tuple<string, PerformanceCounter>> pcList = new List<Tuple<string, PerformanceCounter>>();
        foreach (var pg in processes)
        {
            if (pg.First().ProcessName == "Idle")
                continue;

            if (pg.Count() == 1)
            {
                var process_cpu = new PerformanceCounter(
                           "Process",
                           "% Processor Time",
                           pg.First().ProcessName
                                );
                process_cpu.NextValue();
                pcList.Add(new Tuple<string, PerformanceCounter>(pg.First().ProcessName, process_cpu));
            }
            else
            {
                int id = 1;
                foreach(var p in pg)
                {
                    var process_cpu = new PerformanceCounter(
                           "Process",
                           "% Processor Time",
                           p.ProcessName + "#" + id
                                );
                    process_cpu.NextValue();
                    pcList.Add(new Tuple<string, PerformanceCounter>(p.ProcessName + "#" + id, process_cpu));
                    id++;
                }
            }
        }
1 голос
/ 05 апреля 2012

Добавляя к предыдущим постам, я видел процессы, отформатированные как _ - в зависимости от ОС, на которой вы запускаете приложение (Win XP, Win Vista, Win 7, Win 2003 или 2008 Server),Чтобы иметь надежный способ определения имени вашего процесса для получения других счетчиков производительности в будущем, функция может выглядеть следующим образом:

    private string ObtainProcessName()
    {
        string baseProcessName;
        string processName = null;
        int processId;
        bool notFound = true;
        int processOptionsChecked = 0;
        int maxNrOfParallelProcesses = 3 + 1;

        try
        {
            baseProcessName = Process.GetCurrentProcess().ProcessName;
        }
        catch (Exception exception)
        {
            return null;
        }

        try
        {
            processId = Process.GetCurrentProcess().Id;
        }
        catch (Exception exception)
        {
            return null;
        }

        while (notFound)
        {
            processName = baseProcessName;
            if (processOptionsChecked > maxNrOfParallelProcesses)
            {
                break;
            }

            if (1 == processOptionsChecked)
            {
                processName = string.Format("{0}_{1}", baseProcessName, processId);
            }
            else if (processOptionsChecked > 1)
            {
                processName = string.Format("{0}#{1}", baseProcessName, processOptionsChecked - 1);
            }

            try
            {
                PerformanceCounter counter = new PerformanceCounter("Process", "ID Process", processName);
                if (processId == (int)counter.NextValue())
                {
                    notFound = !true;
                }
            }
            catch (Exception)
            {
            }
            processOptionsChecked++;
        }
        return processName;
    }
1 голос
/ 11 июня 2011

Я думаю, что ваша проблема возникает, когда существует более одного процесса с одинаковым именем.Затем PerfMon добавляет # 1, # 2 и т. Д. К имени процесса.Это означает, что MyApp.exe, выполненный дважды, вызовет это исключение при попытке прочитать монитор производительности для «MyApp».Вот ссылка на один из способов решения этой проблемы: Счетчики производительности чтения по pid

0 голосов
/ 25 апреля 2017

Оригинальный формат, в котором использовался суффикс pid (Registry ProcessNameFormat = 1), по-видимому, изменился с .NET 4.5 ( msdn link ) на "processame_pid_rid".Таким образом, принятый ответ в том виде, в котором он написан в данный момент, может больше не работать в этом случае.

Это решение все еще должно работать для более новых форматов:

https://weblog.west -wind.com / posts/ 2014 / сентябрь / 27 / Идентификатор данных производительности для счетчика производительности-для-процесса-процесса

Однако все эти подходящие решения могут быть подвержены состоянию гонки, когда экземпляризменение имени из-за выхода процесса (# 9 становится # 8) сразу после определения имени экземпляра, но до того, как был выделен новый PerformanceCounter ().

Для MS было бы гораздо больше смысла предоставить конструктор PerformanceCounterкоторый принимает Pid (и, возможно, теперь RuntimeId?) напрямую, поскольку имена экземпляров могут меняться на лету.

0 голосов
/ 16 сентября 2012

Вы можете проверить этот код

Use > new PerformanceCounter("Processor Information", "% Processor Time", "_Total");
Instead of> new PerformanceCounter("Processor", "% Processor Time", "_Total");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...