尝试以编程方式获取进程的私有工作集。
目前,我可以毫无问题地获得工作集,但无法获得私人工作集。
这是方法:
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任务管理器中看到的 - 而不是总工作集。
非常感谢, 添
答案 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。