从C#中的进程ID获取进程名称的最快方法是什么?

时间:2014-08-30 16:14:20

标签: c# .net performance memory process

我在C#中有一堆正在运行的程序的Windows进程ID(PID),我需要知道进程名称(例如chrome)以供参考显示。

我目前使用这种方法:

string processName;
using(var process = Process.GetProcessById(pid))
{
  processName = process.ProcessName; // THIS is costly
}

事实证明,它是我诊断中最慢的功能和最耗费内存之一(根据Visual Studio性能和诊断)。例如,70个呼叫需要12.8 MB的内存。这是我的应用程序所需总内存的一半。

从C#获取流程名称(或有用的流程描述)的替代(和更快)方法是什么?

注意:代码应该在没有管理员权限的情况下运行

1 个答案:

答案 0 :(得分:1)

此类是专为此目的而设计的,因此,如果您对其提供的内容不满意,则在启动应用程序时,您可以生成缓存,简单的运行流程映射,为您自己提供快速访问的来源。对于之后开始或停止的进程 - 监视适当的事件并相应地刷新地图,例如使用WMI:

private IDictionary<int, string> _map;
private ManagementEventWatcher _watcher;

_watcher = new ManagementEventWatcher("SELECT ProcessID, ProcessName FROM Win32_ProcessStartTrace");
_watcher.EventArrived += ProcessStarted;            
_watcher.Start();

private void ProcessStarted(object sender, EventArrivedEventArgs e)
{
    // add proc to _map
}