PerformanceCounters: неопознанное плохое поведение - PullRequest
0 голосов
/ 11 августа 2011

У меня есть приложение для проверки счетчиков, которое контролирует PerformanceCounters [PC] из .Net.

Я использую класс-оболочку для ПК, чтобы разрешить синхронизированный доступ и т. Д. CounterWrapper имеет метод Init, в котором выполняется следующий код:

PerformanceCounterCategory pcc = new PerformanceCounterCategory(this.categoryName, this.machineName);
if(pcc.CounterExists(this.counterName))
{
    if(this.pc != null)    //Could exist from earlier use.
    {
        try
        {
            this.pc.Close();
            this.pc.Dispose();
        }
        catch(Exception ex)
        {
            ...log
        }
    }

    this.pc = new PerformanceCounter(this.categoryName, this.counterName, this.instanceName, this.machineName);
    float value = pc.NextValue();        //Initial read//////-----MARK-----.
}

Этот код изначально хорошо работает.

После того, как один из отслеживаемых компьютеров переходит в автономный режим - это регистрируется в методе обновления - приведенный выше код больше не работает и для проверки удаленной доступности этого счетчика, выше Метод Init снова вызывается. Иногда это работает, иногда это не удается. Если это не удается, я вижу:

InvalidOperation; Сообщение: невозможно получить доступ к закрытому разделу реестра. Имя объекта: 'HKEY_PERFORMANCE_DATA'., Источник: mscorlib

Это находится в ОТМЕТЕННОЙ позиции в коде выше.

Я ожидал, что здесь произойдет сбой кода:

PerformanceCounterCategory pcc = new PerformanceCounterCategory(this.categoryName, this.machineName);
if(pcc.CounterExists(this.counterName))

или здесь:

this.pc = new PerformanceCounter(this.categoryName, this.counterName, this.instanceName, this.machineName);

Но не в "Init" в "value = this.pc.NetxtValue" [ОТПРАВЛЕННОЕ ПОЛОЖЕНИЕ]

Кажется, что-то странное в фреймворке [и это не первый раз, я вижу что-то странное в PerformanceCounters].

Любая помощь будет отличной!

Спасибо, пока С наилучшими пожеланиями,

++ mabra

1 Ответ

0 голосов
/ 11 августа 2011

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

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