Process.GetProcesses() 範圍並不限於應用程式本身,它會返回系統中所有正在執行的 Process 資訊,這包括其他應用程式、系統服務以及其他使用者的 Process,但具體可見的範圍可能受到權限的限制。

WorkingSet64 是 Process 的實際記憶體使用量(物理記憶體),數值為 bytes。

Lambda Expression 應用 - TotalMemory

簡單來說就是在方法呼叫端傳入我們的條件 (像是傳入一個 Where 一樣),來決定內部的計算邏輯範圍

這個實作情境是這樣,使用 Process.GetProcesses() 取得所有 Process,並且篩選 > 20 MB 的 Process,最後計算前兩名的資訊

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

void Main()
{
DisplayMemory(memory => memory > 20 * 1024 * 1024);
}


public class ProcessData
{
public int Id { get; set; }
public long Memory { get; set; }
public string Name{get;set;}
}

public static void DisplayMemory(Func<long,bool> matchCritiria)
{
var processInfoList = new List<ProcessData>();
var systemProcesses = Process.GetProcesses();
foreach(var systemProcess in systemProcesses)
{
if(matchCritiria(systemProcess.WorkingSet64))
{
processInfoList.Add(new ProcessData {Id = systemProcess.Id, Memory = systemProcess.WorkingSet64, Name = systemProcess.ProcessName});
}
}

Console.WriteLine($"Total memory : {processInfoList.Sum(process => process.Memory) / 1024 / 1024} MB");
var top2MemoryResult = processInfoList.OrderByDescending(process => process.Memory)
.Take(2)
.Sum(process => process.Memory) / 1024 / 1024;

Console.WriteLine("Memory consumed by the two most processes: {0} MB", top2MemoryResult);

var results = new
{
NumberOneProcessName = processInfoList.OrderByDescending(process => process.Memory)
.FirstOrDefault().Name,
NumberTwoProcessName = processInfoList.OrderByDescending(process => process.Memory)
.Skip(1)
.FirstOrDefault()
.Name
};

results.Dump();

}

public class ProcessData
{
public int Id { get; set;}
public long Memory {get;set;}
public string Name {get;set;}
}

Image