Почему мои счетчики производительности не меняются? - PullRequest
5 голосов
/ 21 сентября 2009

Я, должно быть, делаю что-то очень неправильно здесь. Я создаю пользовательский счетчик производительности следующим образом:

string counterCategory = "Test Category";
string counterName = "Test Counter";

if (!PerformanceCounterCategory.Exists(counterCategory))
{
    Console.WriteLine("Creating Counters");

    CounterCreationDataCollection counterCreationDataCollection =
        new CounterCreationDataCollection();

    counterCreationDataCollection.Add(
        new CounterCreationData(counterName,
        "Description",
        PerformanceCounterType.NumberOfItems32)
    );

    PerformanceCounterCategory.Create(counterCategory,
        "My category description/Help",
        PerformanceCounterCategoryType.SingleInstance,
        counterCreationDataCollection);
}

Категория счетчика и счетчик создаются и отображаются в мониторе производительности.

Затем я пытаюсь изменить значение счетчика

PerformanceCounter myCounter = 
    new PerformanceCounter(counterCategory, counterName, false);

for (int i = 0; i < 10; i++)
{
    Console.WriteLine("Setting to "+i);
    myCounter.RawValue = i;
    Thread.Sleep(200);
}

myCounter.Close();

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

Так что я делаю не так?

Если я добавлю вызов nextValue () или rawValue (), то значение из этого будет возвращено, как я ожидал, но монитор производительности Windows по-прежнему показывает плоскую линию, например

for (int i = 0; i < 10; i++)
{
    Console.WriteLine("Setting to "+i);
    myCounter.IncrementValue()
    Console.WriteLine("Next Value = "+myCounter.RawValue()); 
    Thread.Sleep(200);
}

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

Ответы [ 3 ]

2 голосов
/ 22 сентября 2009

Последующее наблюдение в порядке. В любом случае, под Win7 монитор производительности может работать не так, как ожидалось. Когда я написал тестовый код, я остановил приложение после создания счетчиков, чтобы запустить монитор производительности. Как только я позволил этому продолжаться, монитор никогда не менял свои счетчики, несмотря на то, что основной счетчик был изменен.

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

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

Спасибо всем за ответы!

1 голос
/ 21 сентября 2009

Возможно ли в ходе тестирования изменить имя счетчика? Ваш код не проверяет, что категория содержит ваш счетчик - он только проверяет, существует ли категория, и если она существует, она не создает категорию.

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

0 голосов
/ 21 сентября 2009

Ваш код выглядит хорошо. Из моего рабочего примера единственное отличие состоит в том, что я вызываю метод приращения после установки RawValue.

PerformanceCounter myCounter = 
    new PerformanceCounter(counterCategory, counterName, false);

for (int i = 0; i < 10; i++)
{
    Console.WriteLine("Setting to "+i);
    myCounter.Increment();
    Thread.Sleep(200);
}

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