2010-03-22 89 views
1

我有一个C#应用程序,它启动时添加了一些性能计数器。但是,如果注册表HKEY_LOCAL_MACHINE-> SOFTWARE-> Microsoft-> Windows NT-> CurrentVersion-> Perflib已损坏(丢失或无效数据),检查性能计数器(PerformanceCounterCategory.Exists(category)是否存在的操作确实需要很长时间(约30秒)才终于抛出异常(InvalidOperation:类别不存在)

我的问题是我如何在尝试添加性能计数器(以及什么有效性的方法)之前验证注册表的有效性,或者如果有一种方法我可以超时性能计数器操作,以便它不需要30秒来得到一个异常。性能计数器注册表验证

回答

1

我怀疑“有效性”是一个内部实现细节,你不知道。但是,您至少可以尝试打开相同的注册表项并查看如果它们存在。您可以使用Process Explorer来确定它正在读取哪些键。

但是,我质疑你为什么会关心。损坏的注册表不应该是一件非常常见的事情,如果是这样,你会怎么做?你所能做的就是退出。所以你可能只是赶上例外。我会像其他任何阻止操作一样对待它,并在工作线程(而不是UI线程)上执行此操作,并向用户显示进度,以便他们知道您的应用程序未挂起。

+0

我关心它,因为它会影响产品的用户体验,虽然我同意你无效的注册表项不应该是一种常见事件,但我仍然需要覆盖此场景。我问这个问题,希望别人碰到这个障碍,并有一个更具体的解决方案。无论如何,谢谢 – anchandra 2010-03-22 23:43:21

+0

是的,我认为你所能做的最好的事情不是挂起并处理它,而不是试图预测它会发生。也许有更好的方法。 – 2010-03-23 06:14:03

0

你确定注册表已损坏吗?

我发现我的程序没有权限在运行时创建性能计数器。相反,我将计数器的创建添加到了我的安装程序,并且安装程序必须以管理员身份运行。在运行时,我的程序在访问或更新已经创建的计数器时没有问题。

+0

这不是权限的问题,因为我已经有一个适当的检查,以确保用户具有管理员权限。注册表中的条目没有价值,因此在30秒后抛出异常。事实上,我不在乎我是否得到异常,只要不需要30秒即可得到它 – anchandra 2010-03-22 23:45:44

0

我不知道如何回答你提出的问题,但如果我理解正确,问题是它看起来像用户启动时挂起应用程序长达30秒。

如果是这样的话,我建议你可以通过创建一个工作者线程来避免这种情况,告诉它创建性能监视器,然后继续启动应用程序。
我还没有与性能计数器合作过,所以我不能说是否有什么会阻止它工作?