7

私はこのコードを持っています:パフォーマンスカウンターを作成する場所。正常に実行され、存在しない場合はパフォーマンス カウンターも作成されますが、perfmon を使用すると、このパフォーマンス カウンターが見つかりません。

何が起こっている?

 const string _categoryName = "MyPerformanceCounter";
    if (!PerformanceCounterCategory.Exists(_categoryName))
    {
        CounterCreationDataCollection counters = new CounterCreationDataCollection();

        CounterCreationData ccdWorkingThreads = new CounterCreationData();
        ccdWorkingThreads.CounterName = "# working threads";
        ccdWorkingThreads.CounterHelp = "Total number of operations executed";
        ccdWorkingThreads.CounterType = PerformanceCounterType.NumberOfItems32;
        counters.Add(ccdWorkingThreads);

        // create new category with the counters above
        PerformanceCounterCategory.Create(_categoryName,
                "Performance counters of my app",
                PerformanceCounterCategoryType.SingleInstance,
                counters);
    }
4

2 に答える 2

2

例外を受け取らない理由は、try-catch ブロックが見つからないためです。このようにtryとcatchブロックにステートメントを追加すると

        try
        {                
            const string _categoryName = "MyPerformanceCounter";
            if (!PerformanceCounterCategory.Exists(_categoryName))
            {
                CounterCreationDataCollection counters = 
                new CounterCreationDataCollection();

                CounterCreationData ccdWorkingThreads = new CounterCreationData();
                ccdWorkingThreads.CounterName = "# working threads";
                ccdWorkingThreads.CounterHelp = "Total number of operations executed";
                ccdWorkingThreads.CounterType = PerformanceCounterType.NumberOfItems32;
                counters.Add(ccdWorkingThreads);

                // create new category with the counters above
                PerformanceCounterCategory.Create(_categoryName,
                        "Performance counters of my app",
                        PerformanceCounterCategoryType.SingleInstance,
                        counters);
            }                
        }
        catch(Exception ex)
        {
            MessageBox.Show(ex.ToString()); //Do necessary action
        }   

次に、例外をキャプチャします。「要求されたレジストリ アクセスは許可されていません」などの例外が表示された場合。次に、その作業を行うには管理者権限が必要です。これを確認するには、Visual Studio を管理者権限で実行し、コードを実行します。

于 2012-10-01T11:11:47.047 に答える
1

カテゴリの作成を許可するために Visual Studio を管理者として実行する以外に、同じ問題がありました。.NET コードはカウンターが存在すると報告しましたが、perfmon にはそのようなカウンター カテゴリは表示されませんでした。

どうやら perfmon は、レジストリで無効としてフラグを立てて、パフォーマンス カウンターを無効にすることがあるようです。

のレジストリをチェックインするとHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services、パフォーマンス カウンター カテゴリを見つけることができるはずです (「フォルダ」の 1 つとしてカテゴリ名を探してください)。サブキー (「フォルダー」) の下でPerformance、レジストリ値Disable Performance Countersを見つけてゼロに設定します。perfmon を再起動すると、perfmon にカテゴリとカウンターが表示されます。

于 2014-10-09T14:26:53.057 に答える