4

几天以来我一直在尝试解决这个问题,所以我想出了一个测试用例:

  • 开始一个新的 asp.net mvc 项目
  • 在 HomeController.Index 上将代码替换为

    var test = new PerformanceCounter("toto", "cac"); 返回内容(“toto”);

  • 确保已设置为使用 IIS Express

  • 在调试时启动项目

在我的机器上,它永远挂在 PerformanceCounter 线上。如果我是停止按钮,我可以看到以下 statcktrace :

[Managed to Native Transition]  
mscorlib.dll!Microsoft.Win32.RegistryKey.InternalGetValue(string name, object defaultValue, bool doNotExpand, bool checkSecurity) + 0x5ae bytes 
mscorlib.dll!Microsoft.Win32.RegistryKey.GetValue(string name) + 0x29 bytes 
System.dll!System.Diagnostics.PerformanceMonitor.GetData(string item) + 0x67 bytes  
System.dll!System.Diagnostics.PerformanceCounterLib.GetPerformanceData(string item) + 0xbb bytes    
System.dll!System.Diagnostics.PerformanceCounterLib.CategoryTable.get() + 0x6a bytes    
System.dll!System.Diagnostics.PerformanceCounterLib.CounterExists(string category, string counter, ref bool categoryExists) + 0x1a bytes    
System.dll!System.Diagnostics.PerformanceCounterLib.CounterExists(string machine, string category, string counter) + 0x4f bytes 
System.dll!System.Diagnostics.PerformanceCounter.InitializeImpl() + 0x2eb bytes 
System.dll!System.Diagnostics.PerformanceCounter.PerformanceCounter(string categoryName, string counterName, string instanceName, bool readOnly) + 0x98 bytes   
System.dll!System.Diagnostics.PerformanceCounter.PerformanceCounter(string categoryName, string counterName) + 0x13 bytes   

TestPerfCounter.dll!TestPerfCounter.Controllers.HomeController.Index() 第 17 行 + 0x21 字节 C#

任何想法 ?如果我切换到开发服务器它不会挂起......

4

1 回答 1

0

我终于找到了解决方案:

http://support.microsoft.com/kb/300956

我不知道为什么,但它解决了

重建基本性能计数器

可扩展计数器信息存储在以下两个位置: 以下注册表子项:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\Current Version\Perflib\009 %Systemroot%\System32\Perfc009.dat 文件和 %Systemroot%\System32 \Perfh009.dat 文件 若要手动重建基本性能计数器库,请按照下列步骤操作: 展开 Perfc009.dat 文件和 Perfh009.dat 文件。这些文件位于 Windows 安装光盘上。压缩文件位于 DriveLetter:\i386\perfc009.da_ 和 DriveLetter:\i386\perfh009.da_。替换 %Systemroot%\System32 文件夹中的文件。启动注册表编辑器,然后在注册表中找到以下项: HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Perflib 在注册表中,将 Last Counter 值更改为 1846(十进制),并将 Last Help 值更改为 1847(十进制)。找到以下注册表项以搜索具有 Performance 子项的服务: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 从 Performance 子项中删除以下值(如果存在): First Counter First Help Last Counter Last Help 您还可以使用 Exctrlst。 exe 工具来定位已安装的性能计数器动态链接库文件 (DLL),然后访问注册表以删除 DWORD 值。您现在拥有一个仅包含系统基本计数器的可用性能注册表。HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 从 Performance 子项中删除以下值(如果存在): First Counter First Help Last Counter Last Help 您还可以使用 Exctrlst.exe 工具来定位性能计数器动态链接库文件(DLL) ),然后访问注册表以删除 DWORD 值。您现在拥有一个仅包含系统基本计数器的可用性能注册表。HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services 从 Performance 子项中删除以下值(如果存在): First Counter First Help Last Counter Last Help 您还可以使用 Exctrlst.exe 工具来定位性能计数器动态链接库文件(DLL) ),然后访问注册表以删除 DWORD 值。您现在拥有一个仅包含系统基本计数器的可用性能注册表。

注意从注册表中的 Performance 子项中删除值可能会导致任何已安装的 .NET Framework 应用程序在下次启动时无法工作。如果发生这种情况,请使用“重新添加可扩展计数器”部分中的 lodctr /R 命令来重建性能计数器。如果您在启动 .NET Framework 应用程序时仍然遇到问题,请参阅本文中的“重新安装任何自定义 .NET Framework 程序集性能计数器”部分。

于 2013-10-30T15:46:56.183 回答