使用.NET 4.7,参考源here。根据文档,如果counterName不存在,构造函数public PerformanceCounter (string categoryName, string counterName, string instanceName, bool readOnly);
应抛出InvalidOperationException。
但正如您从源代码中看到的那样,它只检查计数器是否为只读。例如,这很好地返回:
new PerformanceCounter("ExistingCategory","NameDefinitelyDoesntExist", "ExistingInstance, false)`
那么,我以后会遇到运行时异常吗?我假设只要计数器是可写的并且类别名称存在,相应的性能计数器就不需要实际存在于本地机器上。
我想这样做,所以我可以使用性能计数器编写一些代码,该计数器将在很多机器上运行,而不会经历苦差事,确保计数器存在于每台机器上。
好吧,你可以随时从可写的PerformanceCounter中读取,因此行为的差异很奇怪。这里的文档肯定是不正确的。
当will be thrown(从性能计数器读取的方法)被调用时,看起来.NET正试图反对你的异想天开,作为InvalidOperationException NextValue()
,无论它是否是只读的。对于只读性能计数器,这是您希望调用的唯一方法之一,.NET将简单地抛出异常而不是更晚。
此外,正如我们的名人客人Hans Passant所建议的那样,无论相应的Windows计数器是否确实存在,写入性能计数器(通过RawValue
,IncrementBy
,Decrement
等)都会成功。