|
1 | 1 | using System; |
2 | 2 | using System.Collections.Generic; |
3 | | -using System.Linq; |
4 | | -using System.Text; |
| 3 | +using System.Diagnostics; |
5 | 4 | using System.Threading.Tasks; |
| 5 | +using System.Timers; |
| 6 | +using MemPlus.Classes.RAM.ViewModels; |
6 | 7 |
|
7 | 8 | namespace MemPlus.Classes.RAM |
8 | 9 | { |
9 | | - class RamAnalyzer |
| 10 | + internal sealed class RamAnalyzer |
10 | 11 | { |
| 12 | + private readonly List<ProcessData> _processDataList; |
11 | 13 |
|
| 14 | + internal delegate void ProcessAddedEvent(ProcessData processData); |
| 15 | + internal delegate void ProcessRemovedEvent(ProcessData processData); |
| 16 | + |
| 17 | + private readonly ProcessAddedEvent _processAddedEvent; |
| 18 | + private readonly ProcessRemovedEvent _processRemovedEvent; |
| 19 | + |
| 20 | + internal RamAnalyzer(int delay, ProcessAddedEvent processAddedEvent, ProcessRemovedEvent processRemovedEvent) |
| 21 | + { |
| 22 | + _processAddedEvent = processAddedEvent; |
| 23 | + _processRemovedEvent = processRemovedEvent; |
| 24 | + |
| 25 | + _processDataList = new List<ProcessData>(); |
| 26 | + Timer updateTimer = new Timer |
| 27 | + { |
| 28 | + Interval = delay, |
| 29 | + Enabled = true |
| 30 | + }; |
| 31 | + |
| 32 | + updateTimer.Elapsed += UpdateTimerOnElapsed; |
| 33 | + UpdateTimerOnElapsed(null, null); |
| 34 | + } |
| 35 | + |
| 36 | + private async void UpdateTimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs) |
| 37 | + { |
| 38 | + List<string> currentPaths = new List<string>(); |
| 39 | + await Task.Run(async () => |
| 40 | + { |
| 41 | + foreach (Process p in Process.GetProcesses()) |
| 42 | + { |
| 43 | + try |
| 44 | + { |
| 45 | + currentPaths.Add(p.MainModule.FileName); |
| 46 | + |
| 47 | + ProcessData processData = EqualsPath(p.MainModule.FileName); |
| 48 | + bool addProcessData = false; |
| 49 | + if (processData == null) |
| 50 | + { |
| 51 | + processData = new ProcessData(); |
| 52 | + addProcessData = true; |
| 53 | + } |
| 54 | + |
| 55 | + processData.ProcessName = p.ProcessName; |
| 56 | + processData.ProcessLocation = p.MainModule.FileName; |
| 57 | + processData.Pid = p.Id; |
| 58 | + processData.WorkingSet = (p.WorkingSet64 / 1024 / 1024).ToString("F2") + " MB"; |
| 59 | + |
| 60 | + if (addProcessData) |
| 61 | + { |
| 62 | + _processDataList.Add(processData); |
| 63 | + _processAddedEvent.Invoke(processData); |
| 64 | + } |
| 65 | + } |
| 66 | + catch (Exception ex) |
| 67 | + { |
| 68 | + |
| 69 | + } |
| 70 | + } |
| 71 | + await CleanProcessList(currentPaths); |
| 72 | + }); |
| 73 | + } |
| 74 | + |
| 75 | + private async Task CleanProcessList(IReadOnlyCollection<string> currentPaths) |
| 76 | + { |
| 77 | + await Task.Run(() => |
| 78 | + { |
| 79 | + for (int i = _processDataList.Count - 1; i >= 0; i--) |
| 80 | + { |
| 81 | + bool remove = true; |
| 82 | + |
| 83 | + foreach (string s in currentPaths) |
| 84 | + { |
| 85 | + if (_processDataList[i].ProcessLocation == s) |
| 86 | + { |
| 87 | + remove = false; |
| 88 | + break; |
| 89 | + } |
| 90 | + } |
| 91 | + |
| 92 | + if (remove) |
| 93 | + { |
| 94 | + _processRemovedEvent.Invoke(_processDataList[i]); |
| 95 | + _processDataList.RemoveAt(i); |
| 96 | + } |
| 97 | + } |
| 98 | + }); |
| 99 | + } |
| 100 | + |
| 101 | + private ProcessData EqualsPath(string path) |
| 102 | + { |
| 103 | + foreach (ProcessData pd in _processDataList) |
| 104 | + { |
| 105 | + if (pd.ProcessLocation == path) |
| 106 | + { |
| 107 | + return pd; |
| 108 | + } |
| 109 | + } |
| 110 | + return null; |
| 111 | + } |
| 112 | + |
| 113 | + internal List<ProcessData> GetProcessData() |
| 114 | + { |
| 115 | + return _processDataList; |
| 116 | + } |
12 | 117 | } |
13 | 118 | } |
0 commit comments