按进程ID而不是名称的性能计数器
本文关键字:性能计数器 进程 ID | 更新日期: 2023-09-27 18:22:11
我正在跟踪同一应用程序的多个实例,需要获取两个进程的内存和cpu使用情况。然而,我似乎无法找到使用性能计数器的方法,也不知道哪个结果适用于哪个进程。我已经看到,我可以将#1等附加到名称的末尾,以获得每个名称的结果,但这并不能告诉我哪一个用于哪个进程。
如何确定进程ID或将进程ID传递给计数器,以获得每个具有相同名称的进程的结果?
PerformanceCounterCPU.CategoryName = "Process";
PerformanceCounterCPU.CounterName = "% Processor Time";
PerformanceCounterCPU.InstanceName = proc.ProcessHandle.ProcessName;
PerformanceCounterMemory.CategoryName = "Process";
PerformanceCounterMemory.CounterName = "Working Set - Private";
PerformanceCounterMemory.InstanceName = proc.ProcessHandle.ProcessName;
这个相关问题的答案可能有效:
private static string GetProcessInstanceName(int pid)
{
PerformanceCounterCategory cat = new PerformanceCounterCategory("Process");
string[] instances = cat.GetInstanceNames();
foreach (string instance in instances)
{
using (PerformanceCounter cnt = new PerformanceCounter("Process",
"ID Process", instance, true))
{
int val = (int) cnt.RawValue;
if (val == pid)
{
return instance;
}
}
}
throw new Exception("Could not find performance counter " +
"instance name for current process. This is truly strange ...");
}
如果您不介意在计算机范围内更改注册表,您可以将Windows配置为使用ProcessName_ProcessID形式作为Perf Counter实例名称,而不是附加#1、#2等:
创建DWORD HKEY_LOCAL_MACHINE'SYSTEM'CurrentControlSet'Services'PerfProc'Performance'ProcessNameFormat
并将其值设置为2。
如果您坚持使用#1、#2等形式,请注意给定进程的实例名称在进程的生存期内可能会更改!