From 63b392fa77c21bc0b9f8402bf24e6bc6a3870694 Mon Sep 17 00:00:00 2001 From: Simon G Date: Fri, 23 Apr 2021 18:54:10 +0200 Subject: [PATCH] - fix monitor method --- Lib.ProcessManaging/ProcessManager.cs | 45 ++++++++++++++++----------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/Lib.ProcessManaging/ProcessManager.cs b/Lib.ProcessManaging/ProcessManager.cs index 51bb5d6..fdf3822 100644 --- a/Lib.ProcessManaging/ProcessManager.cs +++ b/Lib.ProcessManaging/ProcessManager.cs @@ -14,12 +14,15 @@ namespace Lib.ProcessManaging public class ProcessManager : IProcessManager { private readonly IObservedProcessFactory _observedProcessFactory; + private readonly CancellationTokenSource _cancellationTokenSource; private Thread? _monitorThread; public ProcessManager(IObservedProcessFactory observedProcessFactory) { _observedProcessFactory = observedProcessFactory; + _cancellationTokenSource = new CancellationTokenSource(); + Processes = new List(); } @@ -27,7 +30,7 @@ namespace Lib.ProcessManaging public void Initialize() { - // using ManualResetEvent monitorReadyEvent = new(false); + using ManualResetEvent monitorReadyEvent = new(false); _monitorThread = new Thread(Monitor) { Name = "Process Monitor", @@ -35,36 +38,42 @@ namespace Lib.ProcessManaging }; _monitorThread.Start(); - // monitorReadyEvent.WaitOne(); + monitorReadyEvent.WaitOne(); } private void Monitor(object? state) { - // if (state is not ManualResetEvent monitorReadyEvent) - // return; - // - // monitorReadyEvent.Set(); + if (state is not ManualResetEvent monitorReadyEvent) + return; - foreach (var process in Process.GetProcesses()) - { - if (Processes.Any(p => p.EqualsProcess(process))) - continue; - - Processes.Add(_observedProcessFactory.Create(process)); - } + monitorReadyEvent.Set(); - foreach (IObservedProcess observedProcess in Processes.ToList().Where(p => !Process.GetProcesses().Any(p.EqualsProcess))) + while (!_cancellationTokenSource.IsCancellationRequested) { - Processes.Remove(observedProcess); - observedProcess.Dispose(); + foreach (var process in Process.GetProcesses()) + { + if (Processes.Any(p => p.EqualsProcess(process))) + continue; + + Processes.Add(_observedProcessFactory.Create(process)); + } + + foreach (var observedProcess in Processes.ToList().Where(p => !Process.GetProcesses().Any(p.EqualsProcess))) + { + Processes.Remove(observedProcess); + observedProcess.Dispose(); + } + + Thread.Sleep(1000); } - - Thread.Sleep(1000); } public void Dispose() { Processes.ForEach(p => p.Dispose()); + + _cancellationTokenSource.Cancel(); + _cancellationTokenSource.Dispose(); _monitorThread = null; } }