性能计数器按进程ID而不是名称?

Jer*_*myK 25 c# performancecounter

我正在跟踪同一个应用程序的多个实例,需要获取两个进程的内存和CPU使用.但是,我似乎无法找到一种方法来使用性能计数器,并知道哪个结果是针对哪个进程的.我已经看到我可以将#1等附加到名称的末尾以获得每个的结果,但这并不能告诉我哪个是哪个进程.

如何确定ProcessId或将进程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;
Run Code Online (Sandbox Code Playgroud)

M.B*_*ock 30

这个答案对一个相关的问题可能的工作:

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 ...");
}
Run Code Online (Sandbox Code Playgroud)

  • 为了提供信用,这最初来自一个旧的Ingo Rammer博客(他的文章在我早期的.NET时代教过我很多):http://weblogs.thinktecture.com/ingo/2004/06/getting-the - 电流 - 处理 - 你自己的CPU-usage.html中 (7认同)
  • 很高兴知道。我注明了复制的来源,这对我来说就足够了。 (2认同)
  • 人们不得不想知道编程API如何设法最终使用名称而不是标识符来识别进程.这个答案适用于角落情况,其中`Process.GetCurrentProcess().ProcessName`在多个实例运行时返回完全无用的值. (2认同)

Seb*_*lls 5

如果您不介意更改计算机范围的注册表,则可以将 Windows 配置为使用 ProcessName_ProcessID 形式作为 Perf Counter 实例名称,而不是附加 #1、#2 等:

创建 DWORDHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PerfProc\Performance\ProcessNameFormat并将其值设置为 2。

如果您坚持使用 #1、#2 等形式,请注意给定进程的实例名称可能会在进程的生命周期内发生变化