PerformanceCounters:身份不明的不良行为

时间:2011-08-10 22:32:33

标签: c# performancecounter

我有一个计数器检查应用程序,它从.Net监视PerformanceCounters [PC]。

我正在使用PC的包装类来允许同步访问等。 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-----.
}

此代码最初效果很好。

其中一台观看的计算机离线后 - 这是在Update方法中注册的 - 上面的代码不再起作用,并测试该计数器的远程可用性,如上所述 再次调用“Init”方法。有时这有效,有时会失败。如果失败了,我明白了:

InvalidOperation;消息:无法访问已关闭的注册表项。 对象名:'HKEY_PERFORMANCE_DATA'。,source:mscorlib

这是在上面代码中的MARKed位置。

我原本预计代码会失败:

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

但不是在“值= this.pc.NetxtValue”的“Init”中[标记位置]

框架中似乎有些奇怪[这不是第一次,我在PerformanceCounters看到一些奇怪的东西]。

任何帮助都会很棒!

到目前为止,谢谢 最好的问候,

++ mabra

1 个答案:

答案 0 :(得分:0)

您关闭并处置PC成员,但是您没有将其设置为null,这是您下次调用时测试的内容,因此您可能在已经关闭的实例上调用Close。