【问题标题】:What is the fastest way to get a process name from a process id in C#从 C# 中的进程 ID 获取进程名称的最快方法是什么
【发布时间】:2014-10-24 09:59:42
【问题描述】:

我有一堆正在运行的 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# 获取进程名称(或有用的进程描述)的替代(和更快)方法是什么?

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

【问题讨论】:

  • 您需要对 GetProcessById() 返回的进程对象调用 Dispose()。尝试添加对 Dispose() 的调用并再次对其进行基准测试。
  • 我已经是了。更新了我的问题以显示它; .ProcessName 很贵。
  • 关于否决票:这个问题怎么不清楚或没有用?请告诉我要添加/更改的内容。

标签: c# .net performance memory process


【解决方案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
}

【讨论】:

  • 我需要获取当前进程列表,但我肯定会尝试使用 WMI 一口气获取所有进程名称。我会在今天晚些时候返回结果。
  • 我实现了向 WMI 查询进程列表的代码,得到的运行速度比 Process.GetProcessById 慢 3 倍;然后我意识到您的意思是:在启动时而不是按需保留进程的实时列表!我认为这是一个了不起的想法,但它需要以提升的权限运行......我会将此要求添加到我的问题中。
  • 要么没有更快的解决方案,要么我找不到替代方案,所以这是公认的答案。即使答案对不以管理员身份运行的用户不起作用,但如果他们这样做,它至少会更快。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-05-05
  • 2023-03-22
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多