性能计数器的NextValue() 方法会抛出InvalidOperationException异常。

8
这是创建性能计数器的代码:
var ftpPerfCounter = new PerformanceCounter("FTP Service", "Current Connections", "_Total");

这里是异常发生的地方:

int cnt = (int)Math.Round(ftpPerfCounter.NextValue());

这是异常信息:

"错误消息:指定类别的计数器布局无效,必须紧接着任何基础计数器类型:AverageBase、CounterMultiBase、RawBase或SampleBase之一,使用以下类型之一的计数器:AverageCount64、AverageTimer32、CounterMultiTimer、CounterMultiTimerInverse、CounterMultiTimer100Ns、CounterMultiTimer100NsInverse、RawFraction或SampleFraction。"

这个错误信息相当晦涩难懂。我不确定未来能做些什么来避免出现这种异常。
细节:
这在Windows Server 2008 R2 64位操作系统上发生。 FTP服务器是IIS。
3个回答

2
至少在我的Windows Server 2008 R2上,使用IIS 7.5时,性能计数器类别称为“Microsoft FTP Service”,而不是“FTP Service”。也许对于不同的操作系统/IIS版本有所不同,但很容易检查。
在您的目标服务器/计算机上:
1. 运行“性能监视器”; 2. 单击左侧导航窗格中的“性能监视器”; 3. 单击加号图标以添加性能计数器; 4. 滚动可用计数器列表。查找FTP或Microsoft FTP以查看是否存在...请注意,如果未安装Microsoft FTP服务,则看不到性能计数器; 5. 找到后,选择它,您将看到一个可以查询的特定计数器实例列表。其中一个实例是您感兴趣的“_Total”。
当然,这也证明了性能计数器独立于您的代码工作。这是一个好消息!
有关如何使用C#/.NET处理性能计数器的具体最佳实践,请参见此stackoverflow帖子。

1

我的电脑上没有安装IIS,但如果我有的话,我会尝试以下方法:

  1. 尝试使用Visual Studio的代码生成器通过从服务器资源管理器中拖放来生成WMI。检查生成的代码并查看与您的代码是否有任何差异。
  2. 使用反编译器查看异常抛出的位置,在BCL内设置自定义断点并重现。然后分析调用堆栈内容并查找可疑的代码路径或意外状态。

0

他们似乎已经在这里解决了类似的问题。也许你需要设置一个基础计数器?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接