我在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#获取流程名称(或有用的流程描述)的替代(和更快)方法是什么?
注意:代码应该在没有管理员权限的情况下运行
答案 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
}