1using System.Collections.Generic;
2using System.Diagnostics;
4#pragma warning disable CA1416
13 private static readonly
string[] categoryNames = GetCategoryNames();
14 private static readonly Dictionary<string, CategoryRec> categories = GetCategories();
20 private static Dictionary<string, CategoryRec> GetCategories()
22 Dictionary<string, CategoryRec> Result =
new();
24 foreach (PerformanceCounterCategory Category
in PerformanceCounterCategory.GetCategories())
26 Result[Category.CategoryName] =
new CategoryRec()
40 private static string[] GetCategoryNames()
42 PerformanceCounterCategory[]
Categories = PerformanceCounterCategory.GetCategories();
44 string[] Names =
new string[c];
46 for (i = 0; i < c; i++)
52 private class CategoryRec
54 public PerformanceCounterCategory Category;
55 public PerformanceCounter[] Counters;
56 public string[] InstanceNames;
57 public Dictionary<string, InstanceRec> Instances;
58 public Dictionary<string, PerformanceCounter> CountersByName;
61 private class InstanceRec
63 public PerformanceCounter[] Counters;
64 public Dictionary<string, PerformanceCounter> CountersByName;
70 public static PerformanceCounterCategory[]
Categories => PerformanceCounterCategory.GetCategories();
82 public static PerformanceCounterCategory
GetCategory(
string CategoryName)
84 if (categories.TryGetValue(CategoryName, out CategoryRec Rec))
95 public static PerformanceCounter[]
GetCounters(
string CategoryName)
97 if (!categories.TryGetValue(CategoryName, out CategoryRec Rec))
98 return System.Array.Empty<PerformanceCounter>();
100 Rec.Counters ??= Rec.Category.GetCounters();
112 PerformanceCounter[] Counters =
GetCounters(CategoryName);
113 int i, c = Counters.Length;
114 string[] Names =
new string[c];
116 for (i = 0; i < c; i++)
117 Names[i] = Counters[i].CounterName;
128 public static PerformanceCounter
GetCounter(
string CategoryName,
string CounterName)
130 if (!categories.TryGetValue(CategoryName, out CategoryRec Rec))
133 if (Rec.CountersByName is
null)
135 Rec.Counters ??= Rec.Category.GetCounters();
137 Dictionary<string, PerformanceCounter> ByName =
new();
139 foreach (PerformanceCounter Counter
in Rec.Counters)
140 ByName[Counter.CounterName] = Counter;
142 Rec.CountersByName = ByName;
145 if (Rec.CountersByName.TryGetValue(CounterName, out PerformanceCounter Result))
159 PerformanceCounter C =
GetCounter(CategoryName, CounterName);
160 return C?.NextValue();
170 if (!categories.TryGetValue(CategoryName, out CategoryRec Rec))
171 return System.Array.Empty<
string>();
173 Rec.InstanceNames ??= Rec.Category.GetInstanceNames();
175 return Rec.InstanceNames;
184 public static PerformanceCounter[]
GetCounters(
string CategoryName,
string InstanceName)
186 if (!categories.TryGetValue(CategoryName, out CategoryRec CategoryRec))
187 return System.Array.Empty<PerformanceCounter>();
189 if (CategoryRec.Instances is
null)
191 Dictionary<string, InstanceRec> Instances =
new();
193 CategoryRec.InstanceNames ??= CategoryRec.Category.GetInstanceNames();
195 foreach (
string Name
in CategoryRec.InstanceNames)
197 Instances[Name] =
new InstanceRec()
199 Counters = CategoryRec.Category.GetCounters(Name)
203 CategoryRec.Instances = Instances;
206 if (!CategoryRec.Instances.TryGetValue(InstanceName, out InstanceRec InstanceRec))
207 return System.Array.Empty<PerformanceCounter>();
209 return InstanceRec.Counters;
219 PerformanceCounter[] Counters =
GetCounters(CategoryName, InstanceName);
220 int i, c = Counters.Length;
221 string[] Names =
new string[c];
223 for (i = 0; i < c; i++)
224 Names[i] = Counters[i].CounterName;
236 public static PerformanceCounter
GetCounter(
string CategoryName,
string InstanceName,
string CounterName)
238 if (!categories.TryGetValue(CategoryName, out CategoryRec CategoryRec))
241 if (CategoryRec.Instances is
null)
243 Dictionary<string, InstanceRec> Instances =
new();
245 CategoryRec.InstanceNames ??= CategoryRec.Category.GetInstanceNames();
247 foreach (
string Name
in CategoryRec.InstanceNames)
249 Instances[Name] =
new InstanceRec()
251 Counters = CategoryRec.Category.GetCounters(Name)
255 CategoryRec.Instances = Instances;
258 if (!CategoryRec.Instances.TryGetValue(InstanceName, out InstanceRec InstanceRec))
261 if (InstanceRec.CountersByName is
null)
263 InstanceRec.Counters ??= CategoryRec.Category.GetCounters(InstanceName);
265 Dictionary<string, PerformanceCounter> ByName =
new();
267 foreach (PerformanceCounter Counter
in InstanceRec.Counters)
268 ByName[Counter.CounterName] = Counter;
270 InstanceRec.CountersByName = ByName;
273 if (InstanceRec.CountersByName.TryGetValue(CounterName, out PerformanceCounter Result))
286 public static double?
GetCounterValue(
string CategoryName,
string InstanceName,
string CounterName)
288 PerformanceCounter C =
GetCounter(CategoryName, InstanceName, CounterName);
289 return C?.NextValue();
295#pragma warning restore CA1416