簡體   English   中英

PerformanceCounterCategory構造函數vs創建方法

[英]PerformanceCounterCategory constructor vs create method

PerformanceCounterCategory class同時具有構造函數Create方法。
兩者都創建一個自定義性能計數器類別。
從文檔中可以看到的唯一區別是create方法還在其創建的類別中添加了性能計數器。

但是,當我測試使用create方法創建自定義類別時,此后我無法將性能計數器與其相關聯。

PerformanceCounterCategory myCat = new PerformanceCounterCategory("test");
PerformanceCounter counter = new PerformanceCounter(myCat.CategoryName, "asd", Process.GetCurrentProcess().ProcessName);
//The second line throws an System.InvalidOperationException: 'Category does not exist.' exception

如果我使用“創建”方法,則不會引發任何異常(忽略此問題的計數器名稱)。

我在文檔中沒有發現任何暗示這種行為的東西。

這是故意的還是使用constructor時我缺少了什么? 另外,使用構造函數和create方法之間有什么區別?

使用Windows性能計數器的一個常見問題是希望根據需要即時創建它們,每次新運行都會創建適合該代碼版本的任何計數器。

Windows性能計數器是很久很久以前設計和實現的,因此,它們打算在某種安裝過程中進行注冊。 那時,所有具有重要意義的軟件在首次安裝和任何更新期間都經過用戶啟動的安裝過程。 實際上,注冊性能計數器類別及其對應的計數器的操作需要相當高的特權(例如,您不能在具有默認特權的IIS下進行此操作)。 該系統也不允許即時更改計數器。 這樣做的好處是,客戶端可以查詢可用的計數器,並知道它們在收集計數器時不會更改(至少在關聯進程運行時)。 如果您希望某些可以動態更改的東西,則必須自己動手(這並不難,除非您希望它們顯示在Windows性能監視器中)。

因此,性能計數器的正確用法如下:在安裝過程中,創建性能計數器類別和相應的計數器:

PerformanceCounterCategory.Create ("My category", "Category Description", PerformanceCounterCategoryType.SingleInstance, counterCreationDataCollection /* <--premade, hardcoded list of counters */);

並在正常執行過程中,連接到先前使用上述Create方法注冊的性能計數器類別:

private static PerformanceCounterCategory _MyCategory = new PerformanceCounterCategory("My category");  // connect to the previously-registered performance counter category so we can set counter values

采用計算機名稱的構造函數是充當客戶端以從另一台計算機收集統計信息。

還請記住,程序中可以有多少個性能計數器是有限制的,並且還需要特殊的網絡特權才能查詢這些值。 限制取決於計數器名稱和幫助的大小及其值,並且很難更改,因此您可能要避免遇到這種情況(根據經驗,我可以告訴您,這樣做時,各種計數器會超出限制似乎都具有相同的值)。 盡管有這些限制,但它們在許多情況下還是很有用的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM