【问题标题】:Get a processes Private Working Set memory获取进程私有工作集内存
【发布时间】:2011-04-15 00:24:01
【问题描述】:

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

目前我能够毫无问题地获得工作集,但无法获得私有工作集。

方法如下:

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 任务管理器中看到的内容 - 而不是总工作集。

非常感谢, 蒂姆

【问题讨论】:

    标签: c# .net windows


    【解决方案1】:

    在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2011-02-06
      • 1970-01-01
      • 2014-09-13
      • 2019-07-25
      • 2013-03-25
      相关资源
      最近更新 更多