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 = [];
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))
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 = [];
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))
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))
189 if (CategoryRec.Instances is
null)
191 Dictionary<string, InstanceRec> Instances = [];
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))
209 return InstanceRec.Counters;
220 PerformanceCounter[] Counters =
GetCounters(CategoryName, InstanceName);
221 int i, c = Counters.Length;
222 string[] Names =
new string[c];
224 for (i = 0; i < c; i++)
225 Names[i] = Counters[i].CounterName;
237 public static PerformanceCounter
GetCounter(
string CategoryName,
string InstanceName,
string CounterName)
239 if (!categories.TryGetValue(CategoryName, out CategoryRec CategoryRec))
242 if (CategoryRec.Instances is
null)
244 Dictionary<string, InstanceRec> Instances = [];
246 CategoryRec.InstanceNames ??= CategoryRec.Category.GetInstanceNames();
248 foreach (
string Name
in CategoryRec.InstanceNames)
250 Instances[Name] =
new InstanceRec()
252 Counters = CategoryRec.Category.GetCounters(Name)
256 CategoryRec.Instances = Instances;
259 if (!CategoryRec.Instances.TryGetValue(InstanceName, out InstanceRec InstanceRec))
262 if (InstanceRec.CountersByName is
null)
264 InstanceRec.Counters ??= CategoryRec.Category.GetCounters(InstanceName);
266 Dictionary<string, PerformanceCounter> ByName = [];
268 foreach (PerformanceCounter Counter
in InstanceRec.Counters)
269 ByName[Counter.CounterName] = Counter;
271 InstanceRec.CountersByName = ByName;
274 if (InstanceRec.CountersByName.TryGetValue(CounterName, out PerformanceCounter Result))
287 public static double?
GetCounterValue(
string CategoryName,
string InstanceName,
string CounterName)
289 PerformanceCounter C =
GetCounter(CategoryName, InstanceName, CounterName);
290 return C?.NextValue();
296#pragma warning restore CA1416