System.Diagnostics中是否存在用於檢索給定CategoryName的所有實例化性能計數器的內置方法?列出某個類別的所有性能計數器
我們有一些使用自定義性能計數器的多線程應用程序,現在需要添加一個儀表板來顯示性能統計信息。
我想使儀表板以這樣的方式進行,即當有人向新的代碼段添加新的計數器時不需要更新儀表板。
System.Diagnostics中是否存在用於檢索給定CategoryName的所有實例化性能計數器的內置方法?列出某個類別的所有性能計數器
我們有一些使用自定義性能計數器的多線程應用程序,現在需要添加一個儀表板來顯示性能統計信息。
我想使儀表板以這樣的方式進行,即當有人向新的代碼段添加新的計數器時不需要更新儀表板。
試試這個:
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);
}
}
你必須要知道,可以有多個實例,並與處理略有不同類別。
只是爲了好玩..這裏是在1線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))
調用cat.GetInstanceNames()是緩慢的,你應該做一個「讓變量」以獲取列表,並重新使用它稍後的 – 2015-05-13 17:08:53