C# 性能计数器损坏?

C# 性能计数器损坏?,c#,.net,performancecounter,C#,.net,Performancecounter,性能计数器是邪恶的。不要使用它们 if(PerformanceCounterCategory.Exists("ILoveYou") ) // is true { PerformanceCounterCategory.Delete("ILoveYou"); //throws exception The **configuration registry** key is invalid } 我所发现的是: (使用LODCTR/R) 这也

性能计数器是邪恶的。不要使用它们

if(PerformanceCounterCategory.Exists("ILoveYou")  ) // is true
{
    PerformanceCounterCategory.Delete("ILoveYou"); 
    //throws exception The **configuration registry** key is invalid
}

我所发现的是: (使用LODCTR/R)

这也没用。因为我不知道他们在谈论什么文件。有人有其他想法吗

PS 我使用的是Windows XP SP3,这可能是问题所在吗?我知道除非我取消页面文件,否则它应该完全支持性能计数器


为了说明这一点,我的问题是无法卸载计数器。

性能计数器更喜欢速度而不是可用性和正确性。XP和更高版本的Windows中的性能计数器很容易被破坏。例如,在应用程序启动时创建一个新的性能计数器类别,并在关闭时将其删除,这是一种非常糟糕的做法。不断更改性能计数器类别肯定会导致性能计数器损坏

我只会在类别尚不存在时创建类别,并将其保留在那里,直到卸载你的应用程序。您希望在什么情况下删除性能计数器类别?我能给你的基本答案是,除非你需要,否则不要删除性能计数器类别

如何通过lodctr或EXCTRLST重新创建性能计数器的一个好链接来自。你可以下载它

Edit1

首先,你需要找到一个工具来解决你的问题。为您提供重新启用损坏的性能计数器的UI


如果这样做有效,您现在可以使用procmon检查在修复操作期间写入了哪些注册表项,并将其用作自动修复功能的输入

我的公司经常遇到性能计数器损坏的问题。如果实际计数器损坏有问题,可以通过以下方式检查损坏的性能计数器:
  • 进入
    start | run | perfmon
  • 单击“确定”
  • 单击右侧面板工具栏上的“添加”按钮(“+”符号按钮)
  • 确保“形式对象”下拉菜单包含项目,而不仅仅是数字
  • 如果计数器为数字或空白:
  • %windir%\system32
    中找到并重命名这3个文件:
    • Perfc009.dat
    • Perfh009.dat
    • Perfi009.dat
  • 插入Windows XP安装光盘
  • 浏览到他们的CD驱动器并进入I386文件夹(即
    D:\I386
  • 在这里找到相同的文件
  • 将它们从CD复制并粘贴回System32
  • 重新启动计算机

  • 这是我们为该问题找到的最佳解决方案。

    如果您有一台类似的机器,您可以运行lodctr/S:mycounters.ini将所有计数器导出到“mycounters.ini”,然后使用lodctr/R:mycounters.ini在损坏的机器上导入它们。请记住,我只在两台机器上使用过这个过程,我知道这两台机器在性能计数器方面几乎相同。我不知道不匹配的机器是否会出现问题。

    对我来说

    使用重新创建所有性能计数器就足够了

    lodctr /R
    
    从具有管理权限的命令行(根据,但跳过手动重新创建基本性能计数器)

    在中检查注册表中的性能计数器列表时

     HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009
    

    事实证明,关键的startet的内容包含大量空白。在该键的最末端有一个高计数器索引的性能计数器列表。调用上面的命令后,该键也正确地包含了基本性能计数器(并且不再包含前导空格)。

    在您提供的链接中还有另一个。你是否遵循了这些步骤,但仍然不起作用?@Schaliasos我确实遵循了链接,但我不明白在代码中应该做什么,我可以从理论上用代码实现他们的指令,但这很复杂,很长,很难看。现在我意识到我没有遵循链接指令命令需要某种文件,我不知道是哪一种。找不到解释您在使用哪个文件时遇到问题?%systemroot%(C:\Windows,最有可能)中的,或安装光盘上的,您必须从命令提示符下用
    expand
    命令展开的,是哪些代码在运行您显示的代码?您是否正在运行多个线程,因为上面的代码不是线程安全的(另一个线程可能会在
    if
    检查和
    Delete
    调用之间中断。这是我的重新安装程序。这就是我的问题所在。我在同一台计算机上完成了此操作,但存在以下问题:备份、手动编辑的备份文本文件(实际上删除了几个计数器),然后还原了结果文件。它成功了。
     HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009