2009-08-20 30 views
8

Belirli bir CategoryName için tüm geçerli performans sayaçlarını almak için System.Diagnostics'te yerleşik bir yöntem var mı?Bir kategori için tüm performans sayaçlarını listele

Özel performans sayaçlarını kullanarak çok sayıda iş parçacığı uygulamasına sahibiz ve artık performans istatistiklerini görüntülemek için bir gösterge tablosu eklememiz gerekiyor.

Gösterge panosunu, birisi yeni bir kod parçasına yeni bir sayaç eklediğinde güncellenmesi gerekmeyecek şekilde yapmak istiyorum.

cevap

25

bu deneyin: Birden örneğini ve biraz daha farklı olanlar başa çıkabilirim kategorilerin farkında olmak zorunda

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); 
    } 
} 

. Sadece eğlence için

6

.. Burada linq 1 hattında aynı şey:

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

cat.GetInstanceNames() yavaş, yapmanız gereken bir "değişken let" listesini almak için, ve bunu yeniden çağırarak daha sonra –

İlgili konular