【问题标题】:Writable Performance Counter doesn't throw exception可写性能计数器不会抛出异常
【发布时间】:2019-07-25 20:07:46
【问题描述】:

使用 .NET 4.7,参考源 here。根据文档,如果 counterName 不存在,构造函数 public PerformanceCounter (string categoryName, string counterName, string instanceName, bool readOnly); 应该抛出 InvalidOperationException。

但正如您从源代码中看到的那样,它只检查计数器是否为只读。例如,这返回就好了:

new PerformanceCounter("ExistingCategory","NameDefinitelyDoesntExist", "ExistingInstance, false)`

那么,我以后会遇到运行时异常吗?否则我假设只要计数器是可写的并且类别名称存在,相应的性能计数器就不需要在本地机器上实际存在。

我想这样做只是为了我可以使用性能计数器编写一些代码,这些代码将在许多机器上运行,而无需费力地确保计数器存在于每台机器上。

【问题讨论】:

  • 这背后更大的想法是缺少性能计数器是很正常的。 For example,需要先使用 lodctr.exe 实用程序安装大量 .NET 框架计数器。写这样一个计数器是没有问题的,没有任何反应。不需要额外的代码,很容易。阅读是个问题,现在你不能再忽视它的缺失了。

标签: .net performancecounter


【解决方案1】:

好吧,我认为您总是可以从可写的 PerformanceCounter 中读取数据,因此行为上的差异很奇怪。这里的文档肯定是不正确的。

看起来 .NET 正试图预测您的突发奇想,当调用从性能计数器读取的方法 NextValue() 时,无论它是否为只读,都会引发 InvalidOperationException will be thrown。对于只读性能计数器,这是您希望调用的唯一方法之一,而 .NET 只会越早抛出异常。

此外,无论相应的 Windows 计数器是否实际存在,写入 到性能计数器(通过RawValueIncrementByDecrement 等)似乎都会成功,因为我们的名人嘉宾 Hans Passant 建议。

【讨论】:

    猜你喜欢
    • 2011-09-16
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    相关资源
    最近更新 更多