2012-01-11 2 views
2

Я создаю и настраиваю счетчики производительности правильно, но когда я удаляю категорию, воссоздайте категорию с тем же именем и добавьте/обновите счетчики к этой категории, это не обновляет счетчики и их значения.Счетчик производительности RawFraction сохраняет свое состояние даже после удаления категории производительности

Следующий код работает нормально в первый раз, но не во второй раз. Код для удаления категории «Удалить» не нужен прямо сейчас, но я хочу иметь возможность удалять существующую категорию при каждом развертывании нашего приложения.

Как я могу навсегда удалить счетчик, если он этого не сделал или не сбросил его значения?

private PerformanceCounter mainCounter; 
    private PerformanceCounter mainCounterBase; 
    private string category = "TestPerformanceCounterTest"; 
    public void Test() 
    { 
        //Counter setup 

     if (PerformanceCounterCategory.Exists(category)) 
      PerformanceCounterCategory.Delete(category); 
     if (!PerformanceCounterCategory.Exists(category)) 
     { 
      var categoryCollection = new CounterCreationDataCollection(); 

      var counter1 = new CounterCreationData("RawCounter1", "", PerformanceCounterType.RawFraction); 
      var counter2 = new CounterCreationData("RawCounterBase1", "", PerformanceCounterType.RawBase); 
      categoryCollection.Add(counter1); 
      categoryCollection.Add(counter2); 


      PerformanceCounterCategory.Create(category, "", PerformanceCounterCategoryType.SingleInstance, categoryCollection); 

      // Wait and wait... 
      Thread.Sleep(TimeSpan.FromSeconds(3)); 
     } 
        //create counters 
        mainCounter = new PerformanceCounter(category, "RawCounter1", false); 
     mainCounterBase = new PerformanceCounter(category, "RawCounterBase1", false); 
        //reset values 
        mainCounter.RawValue = 0; 
     mainCounterBase.RawValue = 0; 

        //update counter 
        mainCounter.IncrementBy(10); 
     mainCounterBase.IncrementBy(20); 
     **Console.WriteLine("Main counter: " +mainCounter.RawValue);//doesnt show value 50 the second time this is run** 
     Console.WriteLine("Main counter Base: " + mainCounterBase.RawValue); 
     Console.WriteLine("Main counter next value: " + mainCounter.NextValue()); 
     Console.WriteLine("Main counter base next value: " + mainCounterBase.NextValue()); 
    } 

ответ

4

Я уверен, что это связано с тем, как Windows управляет данными о производительности.

Из MSDN, PerformanceCounterCategory.Create Method (String, String, PerformanceCounterCategoryType, CounterCreationDataCollection):

Примечание Настоятельно рекомендуется, чтобы новый счетчик производительности категории создаются во время установки приложения, не во время выполнения приложения. Это позволяет оператору оперативной системы обновить список зарегистрированных учетных записей . Если список не был обновлен, попытка использовать категорию не удастся.

У меня нет знаний из первых рук, но это говорит о том, что добавление или исключение категорий не является синхронным действием.

Чтобы обойти эту проблему, вы можете заменить ваш первый if с while вместо, например, так:

while (PerformanceCounterCategory.Exists(category)) 
{ 
    PerformanceCounterCategory.Delete(category); 
} 

Это немного тяжеловесный, хотя. Лучшая рекомендация состоит в том, чтобы не делать счетчик установленным или срывать перед тем, как он вам понадобится. Вместо этого поместите его в установщик или, по крайней мере, создайте отдельный инструмент для их установки и удаления. Кроме того, вы можете создать сценарий Powershell для их установки и удаления. См. Пример http://msdn.microsoft.com/en-us/library/windowsazure/hh508994.aspx.

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