Process.GetProcesses()并按内存使用情况排序

时间:2013-12-23 16:15:05

标签: c# sorting process

我正在使用当前活动用户的正在运行的进程填充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;按字母顺序排序。

我只是好奇,是否可以通过内存使用对它们进行排序,即获取每个进程的内存使用情况并通过循环将它们添加到列表框中?

3 个答案:

答案 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的值才能获得正确的总内存使用量。