【问题标题】:Performance Counter Category Names? (C#)性能计数器类别名称? (C#)
【发布时间】:2023-03-14 02:56:01
【问题描述】:

我正在尝试将性能计数器编程到我的 C# 应用程序中,该应用程序启动另一个进程并检查该启动进程的处理器使用情况。据我了解,性能计数器类要求我分配一个类别名称、一个计数器名称和一个进程名称。我可以很容易地获得进程名称,但是互联网上是否有某种列表,其中包含我可以分配的所有可能的类别和计数器名称?我尝试在 MSDN 上搜索类似的内容,但没有找到任何东西。

感谢大家的帮助!

【问题讨论】:

    标签: c# process msdn performancecounter


    【解决方案1】:

    我想您想知道您可以监控流程的哪些方面。进程性能计数器列表可用here 不过,您可以使用GetCategories 静态方法列出机器中的所有类别,或者您可以更具体地为“进程”类别创建 PerformanceCategory,并使用GetCounters 获取所有可用计数器的列表。 希望这会有所帮助。

    【讨论】:

    • 这个类使用起来非常混乱!他们为什么不使用枚举而不是由这么多复杂字符组成的字符串!
    • 我的猜测是,这是基于每个产品团队(Windows、IIS 等)“拥有”计数器名称的事实,因此他们可以随时添加/删除/更改任何名称.除此之外,我们都可以创建自己的一组计数器。
    • 我认为创建计数器来监控自定义数据没有任何意义,您可以通过编程方式完成。
    • 类别列表非常庞大。此外,每个类别都有自己的计数器名称列表。对机器的这些细节进行如此强烈的抽象真是太酷了。
    【解决方案2】:

    对于那些想要快速浏览并找到所需计数器的人,这里有一个快速表单,它显示三个带有|Categories|Instances|Counters| 的列表框和一个在计时器上更新的计数器值。带过滤器。

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Diagnostics;
    using System.Linq;
    using System.Windows.Forms;
    
    namespace CountersListPreview
    {
        internal static class CounterPreview
        {
            [STAThread]
            private static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                Form f = new CountersListPreviewForm();
                Application.Run(f);
            }
        }
    
        internal class CountersListPreviewForm : Form
        {
            public CountersListPreviewForm()
            {
                InitializeComponent();
            }
    
            private PerformanceCounterCategory[] allCats;
            private string[] instances;
            private PerformanceCounter[] counters;
            private PerformanceCounter counter;
            private Timer TitleRefreshTimer;
    
            private void Form1_Load(object sender, EventArgs e)
            {
                allCats = PerformanceCounterCategory.GetCategories();
                listBox1.DataSource = allCats;
                listBox1.DisplayMember = "CategoryName";
    
                listBox1.SelectedIndexChanged += On_CatChange;
                listBox2.SelectedIndexChanged += On_InstChange;
                listBox3.SelectedIndexChanged += On_CounterChange;
    
                textBox2.TextChanged += On_CatFilterChanged;
                textBox3.TextChanged += On_InstFilterChanged;
                textBox4.TextChanged += On_CounterFilterChanged;
    
                TitleRefreshTimer = new Timer();
                TitleRefreshTimer.Tick += On_Timer;
                TitleRefreshTimer.Interval = 500;
                TitleRefreshTimer.Start();
            }
    
            private void On_Timer(object sender, EventArgs e)
            {
                textBox1.Text = counter != null ? counter.NextValue().ToString() : "";
            }
    
            // --------------- SELECTION CHANGE ------------------
    
            private void On_CatChange(object sender, EventArgs e)
            {
                var cat = listBox1.SelectedItem as PerformanceCounterCategory;
                listBox2.DataSource = instances = cat.GetInstanceNames();
            }
    
            private void On_InstChange(object sender, EventArgs e)
            {
                var cat = listBox1.SelectedItem as PerformanceCounterCategory;
                var inst = listBox2.SelectedItem as string;
                listBox3.DataSource = counters = cat.GetCounters(inst);
                listBox3.DisplayMember = "CounterName";
            }
    
            private void On_CounterChange(object sender, EventArgs e)
            {
                counter = listBox3.SelectedItem as PerformanceCounter;
                On_Timer(null, null);
            }
    
            // --------------- FILTERS ------------------
    
            private void On_CatFilterChanged(object sender, EventArgs e)
            {
                var filter = textBox2.Text;
                listBox1.DataSource = !string.IsNullOrEmpty(filter) 
                    ? allCats.Where(cat => cat.CategoryName.ToLower().Contains(filter.ToLower())).ToArray() 
                    : allCats;
            }
    
            private void On_InstFilterChanged(object sender, EventArgs e)
            {
                var filter = textBox3.Text;
                listBox2.DataSource = !string.IsNullOrEmpty(filter) 
                    ? instances.Where(inst => inst.ToLower().Contains(filter.ToLower())).ToArray() 
                    : instances;
            }
    
            private void On_CounterFilterChanged(object sender, EventArgs e)
            {
                var filter = textBox4.Text;
                listBox3.DataSource = !string.IsNullOrEmpty(filter) 
                    ? counters.Where(c => c.CounterName.ToLower().Contains(filter.ToLower())).ToArray() 
                    : counters;
            }
    
            // --------------- FORM AND LAYOUT ------------------
    
            private readonly IContainer components = null;
    
            protected override void Dispose(bool disposing)
            {
                if (disposing && components != null) components.Dispose();
                base.Dispose(disposing);
            }
    
            #region Windows Form Designer generated code
    
            private void InitializeComponent()
            {
                this.listBox1 = new System.Windows.Forms.ListBox();
                this.listBox2 = new System.Windows.Forms.ListBox();
                this.listBox3 = new System.Windows.Forms.ListBox();
                this.textBox1 = new System.Windows.Forms.TextBox();
                this.label1 = new System.Windows.Forms.Label();
                this.textBox2 = new System.Windows.Forms.TextBox();
                this.textBox3 = new System.Windows.Forms.TextBox();
                this.textBox4 = new System.Windows.Forms.TextBox();
                this.SuspendLayout();
                // 
                // listBox1
                // 
                this.listBox1.FormattingEnabled = true;
                this.listBox1.Location = new System.Drawing.Point(12, 38);
                this.listBox1.Name = "listBox1";
                this.listBox1.Size = new System.Drawing.Size(351, 524);
                this.listBox1.TabIndex = 3;
                // 
                // listBox2
                // 
                this.listBox2.FormattingEnabled = true;
                this.listBox2.Location = new System.Drawing.Point(369, 38);
                this.listBox2.Name = "listBox2";
                this.listBox2.Size = new System.Drawing.Size(351, 524);
                this.listBox2.TabIndex = 3;
                // 
                // listBox3
                // 
                this.listBox3.FormattingEnabled = true;
                this.listBox3.Location = new System.Drawing.Point(726, 38);
                this.listBox3.Name = "listBox3";
                this.listBox3.Size = new System.Drawing.Size(351, 524);
                this.listBox3.TabIndex = 3;
                // 
                // textBox1
                // 
                this.textBox1.Location = new System.Drawing.Point(726, 568);
                this.textBox1.Name = "textBox1";
                this.textBox1.Size = new System.Drawing.Size(351, 20);
                this.textBox1.TabIndex = 4;
                // 
                // label1
                // 
                this.label1.AutoSize = true;
                this.label1.Location = new System.Drawing.Point(606, 571);
                this.label1.Name = "label1";
                this.label1.Size = new System.Drawing.Size(114, 13);
                this.label1.TabIndex = 5;
                this.label1.Text = "Counter Value (500ms)";
                // 
                // textBox2
                // 
                this.textBox2.Location = new System.Drawing.Point(12, 12);
                this.textBox2.Name = "textBox2";
                this.textBox2.Size = new System.Drawing.Size(351, 20);
                this.textBox2.TabIndex = 4;
                // 
                // textBox3
                // 
                this.textBox3.Location = new System.Drawing.Point(369, 12);
                this.textBox3.Name = "textBox3";
                this.textBox3.Size = new System.Drawing.Size(351, 20);
                this.textBox3.TabIndex = 4;
                // 
                // textBox4
                // 
                this.textBox4.Location = new System.Drawing.Point(726, 12);
                this.textBox4.Name = "textBox4";
                this.textBox4.Size = new System.Drawing.Size(351, 20);
                this.textBox4.TabIndex = 4;
                // 
                // Form1
                // 
                this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
                this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
                //this.BackColor = System.Drawing.SystemColors.;
                this.ClientSize = new System.Drawing.Size(1090, 597);
                this.Controls.Add(this.label1);
                this.Controls.Add(this.textBox4);
                this.Controls.Add(this.textBox3);
                this.Controls.Add(this.textBox2);
                this.Controls.Add(this.textBox1);
                this.Controls.Add(this.listBox3);
                this.Controls.Add(this.listBox2);
                this.Controls.Add(this.listBox1);
                //this.ForeColor = System.Drawing.SystemColors.ControlLightLight;
                this.Name = "Form1";
                this.Load += new System.EventHandler(this.Form1_Load);
                this.ResumeLayout(false);
                this.PerformLayout();
            }
    
            #endregion
    
            private ListBox listBox1;
            private ListBox listBox2;
            private ListBox listBox3;
            private TextBox textBox1;
            private Label label1;
            private TextBox textBox2;
            private TextBox textBox3;
            private TextBox textBox4;
        }
    }
    

    【讨论】:

    • 我只想对有用的工具表示感谢,但我发现了一个问题,它在使用不同于英语的语言的计算机上无法正常工作,特别是对于类别.我试图获取内存的实例和计数器,但由于它在我的语言中称为其他东西,所以我只得到一个空列表。您能否编辑代码来解决这个问题?
    • 嘿@SimonJensen,感谢您的提醒。我从系统中获取了一个类别列表,它不会返回列表似乎很奇怪,在这个例子中我没有任何特定的语言。但我也是双语的,所以我可以更改我的系统语言并进行测试。有空的时候我会试着找出问题。
    【解决方案3】:

    我创建了一个显示 CriGoT 上面写的内容的方法,一个小快捷方式。

        private static void GetAllCounters(string categoryFilter)
        {
            var categories = PerformanceCounterCategory.GetCategories();
            foreach (var cat in categories)
            {
                if (categoryFilter != null && categoryFilter.Length > 0)
                {
                    if (!cat.CategoryName.Contains(categoryFilter)) continue;
                }
                Console.WriteLine("Category {0}", cat.CategoryName);
                try
                {
                    var instances = cat.GetInstanceNames();
                    if (instances != null && instances.Length > 0)
                    {
                        foreach (var instance in instances)
                        {
                            //if (cat.CounterExists(instance))
                            //{
                                foreach (var counter in cat.GetCounters(instance))
                                {
                                    Console.WriteLine("\tCounter Name {0} [{1}]", counter.CounterName, instance);
                                }
                            //}
                        }
                    }
                    else
                    {
                        foreach (var counter in cat.GetCounters())
                        {
                            Console.WriteLine("\tCounter Name {0}", counter.CounterName);
                        }
                    }
                }
                catch (Exception)
                {
                    // NO COUNTERS
                }
            }
            Console.ReadLine();
    }
    

    :-)

    【讨论】:

      【解决方案4】:

      您可以随意分配它们。性能监视器将简单地显示您选择的任何类别以及您为特定需要选择的任何计数器名称。

      CounterCreationDataCollection ccdc = new CounterCreationDataCollection();
      ccdc.Add(new CounterCreationData("Counter Title", "Counter Description", PerformanceCounterType.NumberOfItems32));
      PerformanceCounterCategory.Create("My Counter Category", "Category Description", PerformanceCounterCategoryType.Unknown, ccdc);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-13
        • 1970-01-01
        • 2011-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多