PerformanceCounter.NextValue()抛出InvalidOperationException

这是创建性能计数器的代码:

var ftpPerfCounter = new PerformanceCounter("FTP Service", "Current Connections", "_Total");

这是发生异常的地方:

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

这是Exception消息:

“错误消息:指定类别的计数器布局无效,类型:AverageCount64,AverageTimer32,CounterMultiTimer,CounterMultiTimerInverse,CounterMultiTimer100Ns,CounterMultiTimer100NsInverse,RawFraction或SampleFraction类型的计数器必须紧跟任何基本计数器类型:AverageBase ,CounterMultiBase,RawBase或SampleBase。“

该错误消息非常神秘。 我不确定未来可以采取什么措施来避免这种例外。

细节

这发生在Windows Server 2008 R2 64位操作系统上。 FTP服务器是IIS。


至少在IIS 7.5的Windows Server 2008 R2上,性能计数器类别被称为“Microsoft FTP服务”而不是“FTP服务”。 不同的操作系统/ IIS版本可能不同,但它很容易检查。

在您的目标服务器/机器上:

  • 运行“性能监视器”
  • 点击左侧导航窗格中的“性能监视器”
  • 点击加号图标添加性能计数器
  • 向下滚动可用计数器的列表。 查找FTP或Microsoft FTP以查看它是否存在......请注意,如果您没有安装Microsoft FTP服务,您将看不到性能计数器。
  • 一旦找到,选择它,你会看到一个你可以查询的特定计数器实例列表。 其中一个例子是您感兴趣的'_Total'。
  • 当然这也证明了性能计数器独立于你的代码工作。 这是一件好事,要知道!

    有关如何在C#/ .NET中使用性能计数器的具体最佳实践,请参阅此计算器文章。


    我没有在我的电脑上安装IIS,但是如果我这样做,我会试试这个:

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

  • 他们似乎在这里解决了类似的问题。 也许你必须建立一个基地柜台?

    链接地址: http://www.djcxy.com/p/10793.html

    上一篇: PerformanceCounter.NextValue() throws InvalidOperationException

    下一篇: cython numpy accumulate function