Счетчик производительности RawFraction сохраняет свое состояние даже после удаления категории производительности - PullRequest
2 голосов
/ 11 января 2012

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

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

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

    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());
    }

1 Ответ

4 голосов
/ 21 января 2012

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

Из MSDN, PerformanceCounterCategory.Create Метод (String, String, PerformanceCounterCategoryType, CounterCreationDataCollection) :

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...