获取进程私有工作集内存

时间:2010-09-21 04:45:22

标签: c# .net windows

尝试以编程方式获取进程的私有工作集。

目前,我可以毫无问题地获得工作集,但无法获得私人工作集。

这是方法:

private void GetProcessesForServer(string serverName)
{
    var runningProcesses = new Process[0];

    try
    {
        runningProcesses = Process.GetProcesses(serverName);

    }
    catch (Exception e)
    {
        ResultsPanel.Controls.Add(new Label { Text = string.Format("There was an error: {0}", e.GetBaseException().Message) });
    }

    IOrderedEnumerable<CustomProcess> processes = runningProcesses
        .Select(process => new CustomProcess(process.Id, process.ProcessName, (process.WorkingSet64 / 1024)))
        .ToList()
        .OrderBy(process => process.ProcessName);

    if (processes.Count() > 0)
        ResultsLabel.Text = string.Format("Current running processes on {0}", ServerNamesDropDown.SelectedItem.Text);

    ResultsGridView.DataSource = processes;
    ResultsGridView.DataBind();
}

所以我传入服务器名称,然后尝试获取该服务器的所有正在运行的进程,然后将进程列表绑定到网格视图。一切正常,但我需要获得私有工作集 - 类似于您在Windows任务管理器中看到的 - 而不是总工作集。

非常感谢, 添

1 个答案:

答案 0 :(得分:2)

在Windows Vista及更高版本中,“处理”类别中有“工作集 - 私人”性能计数器(请参阅msdn)。

鉴于您在这样的平台上,您可以使用System.Diagonstics.PerformanceCounter类来查询此信息。

要在进程ID和给定的性能计数器实例之间建立链接,请使用类别的“ID进程”计数器。换句话说:查找“ID Process”计数器是您所需的进程ID的实例,读取“Working Set - Private”计数器的值。

提示:如果您需要查询所有进程的所有值,请使用System.Diagonstics.PerformanceCounterCategory.ReadCategory()调用,因为读取单个计数器对所有进程/实例的速度要快得多。

更新codeproject上有一篇文章展示了如何在XP / 2000上计算该值,如果必须的话。我没有测试过,所以不要怪我; - )

更新2 :您可能还想查看此stackoverflow question/answer