2014-10-03 4 views
-1

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

Даже перемещение окна происходит медленно, и я уверен, что это связано с событием отключения потока, которое в основном работает каждую секунду. Я установил таймеры всегда с интервалом в 1 секунду, потому что я хочу, чтобы он отображал информацию типа «в реальном времени».

Вот мой код до сих пор:

private PerformanceCounter pcProcess; //Process 
    private PerformanceCounter pcMemory; //Memory 

    private void tmrProcess_Tick(System.Object sender, System.EventArgs e) 
    { 
     pcProcess = new PerformanceCounter(); //New Performance Counter Object 
     pcProcess.CategoryName = "Processor"; //Specify Process Counter 
     pcProcess.CounterName = "Interrupts/sec"; 
     pcProcess.InstanceName = "_Total"; 
     pcProcess.NextValue(); 
     System.Threading.Thread.Sleep(1000); 
     cpInt.Text = pcProcess.NextValue().ToString(); //Display 
     pcProcess.CounterName = "% Processor Time"; 
     pcProcess.InstanceName = "_Total"; 
     pcProcess.NextValue(); 
     System.Threading.Thread.Sleep(1000); 
     cpPower.Text = pcProcess.NextValue().ToString() + "%"; //Display 
    } 

    private void tmrMemory_Tick(System.Object sender, System.EventArgs e) 
    { 
     pcMemory = new PerformanceCounter(); 

     pcMemory.CategoryName = "Memory"; 
     //This counter gives a general idea of how many times information being requested is not   where the application (and VMM) expects it to be 
     pcMemory.CounterName = "Available MBytes"; 
     avlMem.Text = pcMemory.NextValue().ToString() + " Mb"; 
     pcMemory.CounterName = "Page Faults/sec"; 
     pcMemory.NextValue(); 
     System.Threading.Thread.Sleep(1000); 
     pgFaults.Text = pcMemory.NextValue().ToString(); 
    } 

ответ

1
  • Отбросьте идею вызова Thread.Sleep. Это почти никогда хорошая идея.
  • Не создавайте новый экземпляр PerformanceCounter() на каждый таймер, просто звоните perfmonCounter.NextValue().
  • Вызвать NextValue() один раз после счетчика init, чтобы он возвращал что-то еще, чем 0.0 при первом таймере. См remarks раздел на http://msdn.microsoft.com/en-us/library/system.diagnostics.performancecounter.nextvalue(v=vs.110).aspx:

Если расчетное значение счетчика зависит от того, два счетчика читает, первая операция чтения возвращает 0.0. Сброс счетчика производительности Свойства для задания другого счетчика эквивалентны созданию нового счетчика производительности , а первая операция чтения с использованием новых свойств возвращает 0.0. Рекомендуемое время задержки между вызовами . Метод NextValue составляет одну секунду, чтобы позволить счетчику выполнить следующее пошаговое чтение.

Так в основном:

private PerformanceCounter pcMemory; 

private void InitPerfmon() 
{ 
    this.pcMemory = new PerformanceCounter(); 
    this.pcMemory.CounterName = "Available MBytes"; 
    this.pcMemory..... 
    ... 
    this.pcMemory.NextValue(); 
} 

private void tmrMemory_Tick(System.Object sender, System.EventArgs e) 
{ 
    this.pgFaults.Text = this.pcMemory.NextValue().ToString(); 
} 
+0

Должен ли я позвонить PerformanceCounter дважды? Итак, это будет this.pcMemory = новый PerformanceCounter this.pcProcess = new PerformanceCounter(); – user263029

+0

@ user263029 Да, у вас должен быть один экземпляр для каждого счетчика, который вы контролируете – ken2k

Смежные вопросы