请求的性能计数器不是自定义计数器,它必须初始化为 ReadOnly

Posted

技术标签:

【中文标题】请求的性能计数器不是自定义计数器,它必须初始化为 ReadOnly【英文标题】:The requested Performance Counter is not a custom counter, it has to be initialized as ReadOnly 【发布时间】:2011-01-04 00:59:47 【问题描述】:

每当我尝试调试 .NET Windows 服务应用程序时,我都会收到有关性能计数器上 ReadOnly 属性的重复错误。这个应用程序在 x86 windows vista 或 x86 windows 2003 上运行良好。它刚刚停止在我的新 64 位开发机器上运行。

我已经在 64 位和 32 位命令行 VCVARS.bat 上以管理员模式运行了相关的 InstallUtil 调用。我得到设置类别和每个性能计数器没有错误。但是,无论我是否将 perf ctrs 设置为只读,我都会得到:

请求的性能计数器是 不是自定义计数器,它必须是 初始化为只读。

更新

我用 32 位版本的 Windows 7 重新安装了机器,但奇怪的是我仍然收到此错误。唯一改变的是从 Windows Vista Business 迁移到 Windows 7 Professional。这会响铃吗?

【问题讨论】:

我很久以前就遇到过这个问题,并认为我最终只是为我需要做的事情创建了一个自定义计数器,所以这没有帮助..但我可以说我没有在这种情况下,32 v 64 位的问题,所以你可能不值得追太久。 谢谢吉姆,我开始认为我铺好机器并重新安装 x86 windows 比找到解决这个问题的方法更快!伤心。但确实如此。 【参考方案1】:

这是由于性能计数器(或类别)not existing, 但有一个可怕的错误消息。

在perfmon中查看计数器,相关机器上应该没有它。

我发现 .Net 性能计数器有时会发生这种情况(不知道为什么),但 using lodctr1 会将它们恢复。如果您指出您尝试使用哪个性能计数器,我们可能会为您提供更多帮助。

    请注意,内衬示例适用于 .Net 1.1,请针对不同的框架进行相应调整。

【讨论】:

我正在使用 .Net 4.0.30319。我尝试使用 lodctr(使用 v4 设置),但问题仍然存在。我在这里上传了我的错误消息的屏幕截图:imgur.com/eJ4uk +1。从 .NET 2.0 开始,对于不存在的计数器,我收到相同的错误消息。 我也有像 robasta 一样的问题。请您建议任何其他方式,如果您需要任何其他详细信息,例如事件错误日志,请告诉我们, 当一些自定义性能计数器丢失时,我在 .Net 4.5 中收到此错误消息。如果您要安装客户计数器,请确保它们安装正确。关闭并重新打开 PerfMon 以确保它们在那里。 是的,需要先添加CounterDataCollection:PerformanceCounterCategory.Create(CategoryName, CategoryDe​​scription, PerformanceCounterCategoryType.SingleInstance, counterDataCollection);你可以在这里看到一个例子:dotnetcodr.com/2014/11/18/…【参考方案2】:

我遇到了这个问题的一个变种,虽然我可以在反射器中看到 .net 性能计数器选项卡,但它实际上没有计数器。

I had to re-add them

lodctr /R
cd C:\Windows\Inf\.NETFramework
lodctr corperfmonsymbols.ini

【讨论】:

我必须先使用 unlodctr 卸载性能计数器,如标记答案中所述。【参考方案3】:

我在这个问题上花了好几个小时,按照网上找到的所有说明,所以我决定分享我的解决方案,也许它会为其他人节省一些时间。 最后我在cmets中的一个链接下得到了提示:

您需要以管理员身份运行 Visual Studio

我的应用程序正在将 MassTrasit 与 RabbitMQ 结合使用,但无法将消息发送到队列。显然,它在后台添加了一些性能计数器,并且在没有管理员权限的情况下失败,并出现了非常描述性的错误。 有趣的是,您只需要第一次以管理员身份运行它(这就是欺骗我的原因)。

【讨论】:

【参考方案4】:

我在我的部署机器上遇到了这个误导性错误,我使用 FirstChanceException 机制发现了这个错误, 发生此错误后,IIS 反复停止相关的应用程序池,并且在调用该站点时出现“服务不可用”错误,

我尝试了很多天来停止计数器或查找/添加相关计数器,但没有成功。

所以我在服务器上安装了 VS 并进行了调试,发现 我一直在未正确执行的异步操作中调用不可等待的 Linq 查询,因此应用程序线程中存在错误, 当有很多站点访问者时,会出现此错误,并且 IIS 会抛出此异常并停止工作。

在检查 ShuggyCoUk 答案和其他答案后,如果您仍然收到错误,我的建议是考虑检查相关的异步函数。

【讨论】:

以上是关于请求的性能计数器不是自定义计数器,它必须初始化为 ReadOnly的主要内容,如果未能解决你的问题,请参考以下文章

跨应用域回收使用自定义性能计数器

通过 WMI 访问应用程序的自定义性能计数器

自定义性能计数器触发安全异常。为啥?

性能计数器 - 每分钟速率类型? [复制]

如何重置自定义性能计数器

自定义时间段内的性能计数器