我正在使用当前活动用户的正在运行的进程填充ListBox(listRAM
):
Process[] RAM = Process.GetProcesses();
Process[] sameAsthisSession = (from c in RAM where c.SessionId == Process.GetCurrentProcess().SessionId select c).ToArray();
foreach (var p in sameAsthisSession)
{
listRAM.Items.Add(p.ProcessName);
}
listRAM.Sorted = true;
流程将按listRAM.Sorted = true;
按字母顺序排序。
我只是好奇,是否可以通过内存使用对它们进行排序,即获取每个进程的内存使用情况并通过循环将它们添加到列表框中?
答案 0 :(得分:3)
尝试以下方法:
var RAM = Process.GetProcesses();
var procs = RAM.Where(x => x.SessionId == Process.GetCurrentProcess().SessionId)
.OrderByDescending(x => x.PrivateMemorySize64)
.ToList();
foreach (var p in procs)
{
listRAM.Items.Add(p.ProcessName);
}
答案 1 :(得分:1)
listRAM.Sorted
会使其中的值按名称排序。
如果您想按内存使用情况排序,则需要对列表进行预排序,并将listRAM.Sorted
保留为false
。
此外,如果按内存使用情况进行排序,您可能希望将Process
对象包装在帮助程序对象中,以将RAM显示为名称的一部分,从而使得使用的排序更加明显。
例如:
class ProcessWrapper
{
private Process _process;
public ProcessWrapper(Process process)
{
_process = process;
}
public override string ToString()
{
return _process.ToString() + " (" + _process.PrivateMemorySize64 / 1000000L + "M)";
}
}
答案 2 :(得分:1)
您可以将其减少到单个LINQ语句:
var pNames = Process.GetProcesses()
.Where(x => x.SessionId == Process.GetCurrentProcess().SessionId)
.OrderByDescending(x => x.PagedMemorySize64)
.Select(x => x.ProcessName);
foreach (var name in pNames)
listRam.Items.Add(name);
PagedMemorySize64“表示进程使用的虚拟内存分页文件中的当前内存大小。”
我没有对此进行过测试,但您可能需要添加PagedMemorySize64和NonpagedSystemMemorySize64的值才能获得正确的总内存使用量。