2010-02-19 77 views
13

我试图在性能计数器到我的C#应用​​程序,启动另一个进程,并检查启动过程的处理器使用编程。据我了解,性能计数器类要求我分配一个类别名称,一个计数器名称和一个进程名称。我可以很容易地得到进程名称,但是在互联网上是否有一个列表有我可以分配的所有可能的类别和计数器名称?我试图为MSDN搜索这样的东西,但我没有找到任何东西。性能计数器类别名称? (C#)

感谢您的帮助!

回答

18

我想你想知道你可以监视的过程的哪些方面。过程性能计数器列表可用here 尽管如此,您仍然可以使用静态方法列出机器中的所有类别,或者您可以更具体地为“过程”类别创建PerformanceCategory,并使用GetCounters来获取列表的所有可用计数器。 希望这有助于。

+3

这个类是如此混乱使用!他们为什么不使用枚举而不是由许多复杂字符组成的字符串! – TheGateKeeper 2012-04-16 21:28:45

+1

我的猜测是,它基于每个产品团队(Windows,IIS等)“拥有”计数器名称的事实,因此他们可以随时添加/删除/更改任何名称。 除此之外,我们都可以创建自己的计数器。 – CriGoT 2012-04-18 13:04:47

+0

我认为没有必要创建一个计数器来监控自定义数据,你可以通过编程来完成。 – TheGateKeeper 2012-04-18 16:17:43

1

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

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

我已经创建了显示什么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(); 
} 

希望得到这个帮助。

1

对于那些谁想要快速浏览和查找所需的反这里有一个快速表单显示三个列表框与|Categories|Instances|Counters|和被一个计时器更新计数器值。带过滤器。

enter image description here

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; 
    } 
} 
+0

我只想说谢谢这个有用的工具,但是我发现它有点问题,它在使用与英语不同的语言的计算机上无法正常工作,特别是针对类别。我试图获取内存的实例和计数器,但是因为它用我的语言调用了其他东西,所以我只是为这些列表获得了一个空列表。你能编辑代码来解释这个吗? – 2017-10-13 13:30:44

+0

嗨@SimonJensen,谢谢你的抬头。我从系统中得到一个类别列表,似乎很奇怪它不会返回列表,在这个例子中我没有任何特定的语言。但我也是双语的,所以我可以改变我的系统语言并进行测试。当我有空闲时,我会尽力找到问题。 – n1kk 2017-10-16 07:34:53