2010-03-22 131 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秒。

如果是這樣的話,我建議你可以通過創建一個工作者線程來避免這種情況,告訴它創建性能監視器,然後繼續啓動應用程序。
我還沒有與性能計數器合作過,所以我不能說是否有什麼會阻止它工作?