2012-01-11 10 views
2

パフォーマンスカウンターを正しく作成して設定していますが、カテゴリーを削除すると、同じ名前のカテゴリーを再作成してそのカテゴリーにカウンターを追加/カウンタとその値を更新できません。パフォーマンスカテゴリを削除した後もRawFractionパフォーマンスカウンターがその状態を維持します

次のコードは初めて正常に動作しますが、2回目は正常に動作しません。 「カテゴリを削除する」というコードは今必要ではありませんが、アプリケーションを配備するたびに既存のカテゴリを削除できるようにしたいと考えています。

カウンタをリセットしないでリセットしたり値をリセットしたりすると、カウンタを完全に削除できますか?

private PerformanceCounter mainCounter; 
    private PerformanceCounter mainCounterBase; 
    private string category = "TestPerformanceCounterTest"; 
    public void Test() 
    { 
        //Counter setup 

     if (PerformanceCounterCategory.Exists(category)) 
      PerformanceCounterCategory.Delete(category); 
     if (!PerformanceCounterCategory.Exists(category)) 
     { 
      var categoryCollection = new CounterCreationDataCollection(); 

      var counter1 = new CounterCreationData("RawCounter1", "", PerformanceCounterType.RawFraction); 
      var counter2 = new CounterCreationData("RawCounterBase1", "", PerformanceCounterType.RawBase); 
      categoryCollection.Add(counter1); 
      categoryCollection.Add(counter2); 


      PerformanceCounterCategory.Create(category, "", PerformanceCounterCategoryType.SingleInstance, categoryCollection); 

      // Wait and wait... 
      Thread.Sleep(TimeSpan.FromSeconds(3)); 
     } 
        //create counters 
        mainCounter = new PerformanceCounter(category, "RawCounter1", false); 
     mainCounterBase = new PerformanceCounter(category, "RawCounterBase1", false); 
        //reset values 
        mainCounter.RawValue = 0; 
     mainCounterBase.RawValue = 0; 

        //update counter 
        mainCounter.IncrementBy(10); 
     mainCounterBase.IncrementBy(20); 
     **Console.WriteLine("Main counter: " +mainCounter.RawValue);//doesnt show value 50 the second time this is run** 
     Console.WriteLine("Main counter Base: " + mainCounterBase.RawValue); 
     Console.WriteLine("Main counter next value: " + mainCounter.NextValue()); 
     Console.WriteLine("Main counter base next value: " + mainCounterBase.NextValue()); 
    } 

答えて

4

私は、これはWindowsのパフォーマンスデータを管理する方法が原因であるかなり確信しています。 MSDNから

PerformanceCounterCategory.Create Method (String, String, PerformanceCounterCategoryType, CounterCreationDataCollection)

強く新しいパフォーマンスカウンタ カテゴリは、アプリケーションの実行中のアプリケーションのインストール、ない 中に作成することをお勧めします。これにより、 オペレーティングシステムが、登録されたパフォーマンスカウンタ カテゴリのリストを更新する時間が可能になります。リストがリフレッシュされていない場合、 カテゴリの使用は失敗します。

私には直接の知識はありませんが、これはカテゴリの追加または削除が同期動作ではないことを示しています。これを回避するには

、あなたはそうのように、代わりにwhileであなたの最初のifを交換する場合がありますけれども、少し強引だ

while (PerformanceCounterCategory.Exists(category)) 
{ 
    PerformanceCounterCategory.Delete(category); 
} 

。あなたがそれを必要とする直前にカウンタの設定や解除を行わないことをお勧めします。代わりに、インストーラーに入れてください。あるいは、少なくともインストール/アンインストールするための別のツールを作成してください。また、Powershellスクリプトを作成してインストール/アンインストールすることもできます。例については、http://msdn.microsoft.com/en-us/library/windowsazure/hh508994.aspxを参照してください。