2009-08-20 26 views
8

Có phương pháp tích hợp trong System.Diagnostics để truy xuất tất cả các bộ đếm hiệu suất được tạo ngay cho một CategoryName cụ thể không?Liệt kê tất cả các bộ đếm hiệu suất cho một danh mục

Chúng tôi có một số ứng dụng đa luồng sử dụng bộ đếm hiệu suất tùy chỉnh và giờ đây cần phải thêm trang tổng quan để hiển thị thống kê hiệu suất.

Tôi muốn tạo trang tổng quan theo cách sao cho không cần cập nhật bất cứ khi nào ai đó thêm bộ đếm mới vào một đoạn mã mới.

Trả lời

25

Hãy thử điều này:

public void ListCounters(string categoryName) 
{ 
    PerformanceCounterCategory category = PerformanceCounterCategory.GetCategories().First(c => c.CategoryName == categoryName); 
    Console.WriteLine("{0} [{1}]", category.CategoryName, category.CategoryType); 

    string[] instanceNames = category.GetInstanceNames(); 

    if (instanceNames.Length > 0) 
    { 
     // MultiInstance categories 
     foreach (string instanceName in instanceNames) 
     { 
      ListInstances(category, instanceName); 
     } 
    } 
    else 
    { 
     // SingleInstance categories 
     ListInstances(category, string.Empty); 
    } 
} 

private static void ListInstances(PerformanceCounterCategory category, string instanceName) 
{ 
    Console.WriteLine(" {0}", instanceName); 
    PerformanceCounter[] counters = category.GetCounters(instanceName); 

    foreach (PerformanceCounter counter in counters) 
    { 
     Console.WriteLine("  {0}", counter.CounterName); 
    } 
} 

Bạn phải nhận biết các loại có thể có nhiều trường hợp và đối phó với những hơi khác nhau.

6

Just for fun .. đây là điều tương tự trong 1 dòng của LINQ:

PerformanceCounterCategory 
.GetCategories() 
.Where(cat => cat.CategoryName == "ASP.NET v4.0.30319") 
.Select (cat => cat.GetInstanceNames().Any() ? cat.GetInstanceNames().Select (i => cat.GetCounters(i)).SelectMany (counter => counter) : cat.GetCounters("")).SelectMany (counter => counter) 
.Select(counter => string.Format("{0} : {1}.{2}", counter.InstanceName , counter.CategoryName, counter.CounterName)) 
+0

gọi cat.GetInstanceNames() là chậm, bạn nên làm một "chúng ta hãy biến" để có được danh sách, và tái sử dụng nó sau này –

Các vấn đề liên quan