我有一个计数器检查应用程序,它从.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
答案 0 :(得分:0)
您关闭并处置PC成员,但是您没有将其设置为null,这是您下次调用时测试的内容,因此您可能在已经关闭的实例上调用Close。