// Author: Gockner, Simon // Created: 2021-04-23 // Copyright(c) 2021 SimonG. All Rights Reserved. using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; using Lib.ProcessManaging.Factories; using Lib.ProcessManaging.Interfaces; namespace Lib.ProcessManaging { public class ProcessManager : IProcessManager { private readonly IObservedProcessFactory _observedProcessFactory; private Thread? _monitorThread; public ProcessManager(IObservedProcessFactory observedProcessFactory) { _observedProcessFactory = observedProcessFactory; Processes = new List(); } public List Processes { get; } public void Initialize() { // using ManualResetEvent monitorReadyEvent = new(false); _monitorThread = new Thread(Monitor) { Name = "Process Monitor", IsBackground = true }; _monitorThread.Start(); // monitorReadyEvent.WaitOne(); } private void Monitor(object? state) { // if (state is not ManualResetEvent monitorReadyEvent) // return; // // monitorReadyEvent.Set(); foreach (var process in Process.GetProcesses()) { if (Processes.Any(p => p.EqualsProcess(process))) continue; Processes.Add(_observedProcessFactory.Create(process)); } foreach (IObservedProcess observedProcess in Processes.ToList().Where(p => !Process.GetProcesses().Any(p.EqualsProcess))) { Processes.Remove(observedProcess); observedProcess.Dispose(); } Thread.Sleep(1000); } public void Dispose() { Processes.ForEach(p => p.Dispose()); _monitorThread = null; } } }