diff --git a/Lib.ProcessManaging/ProcessManager.cs b/Lib.ProcessManaging/ProcessManager.cs index 78b8812..22e3b09 100644 --- a/Lib.ProcessManaging/ProcessManager.cs +++ b/Lib.ProcessManaging/ProcessManager.cs @@ -17,6 +17,8 @@ namespace Lib.ProcessManaging private readonly IObservedProcessFactory _observedProcessFactory; private readonly CancellationTokenSource _cancellationTokenSource; + private readonly object _processesLock = new(); + private Thread? _monitorThread; public ProcessManager(IObservedProcessFactory observedProcessFactory) @@ -31,45 +33,46 @@ namespace Lib.ProcessManaging public void Initialize() { - using ManualResetEvent monitorReadyEvent = new(false); _monitorThread = new Thread(Monitor) { Name = "Process Monitor", IsBackground = true }; - _monitorThread.Start(monitorReadyEvent); - monitorReadyEvent.WaitOne(); + _monitorThread.Start(); } - public IObservedProcess? GetProcessById(int id) => Processes.FirstOrDefault(p => p.Id == id); - private void Monitor(object? state) + public IObservedProcess? GetProcessById(int id) { - if (state is not ManualResetEvent monitorReadyEvent) - return; - - monitorReadyEvent.Set(); + lock (_processesLock) + return Processes.FirstOrDefault(p => p.Id == id); + } + private void Monitor() + { while (!_cancellationTokenSource.IsCancellationRequested) { - IEnumerable processes = Process.GetProcesses(); - foreach (var process in processes) + lock (_processesLock) { - if (Processes.Any(p => p.EqualsProcess(process))) - continue; + IEnumerable processes = Process.GetProcesses(); + foreach (var process in processes) + { + if (Processes.Any(p => p.EqualsProcess(process))) + continue; - IObservedProcess observedProcess = _observedProcessFactory.Create(process); - if (string.IsNullOrEmpty(observedProcess.FileName)) - continue; - - Processes.Add(observedProcess); - ProcessStarted?.Invoke(this, observedProcess); - } + IObservedProcess observedProcess = _observedProcessFactory.Create(process); + if (string.IsNullOrEmpty(observedProcess.FileName)) + continue; - foreach (var observedProcess in Processes.ToList().Where(p => !processes.Any(p.EqualsProcess))) - { - Processes.Remove(observedProcess); - ProcessExited?.Invoke(this, observedProcess); + Processes.Add(observedProcess); + ProcessStarted?.Invoke(this, observedProcess); + } + + foreach (var observedProcess in Processes.ToList().Where(p => !processes.Any(p.EqualsProcess))) + { + Processes.Remove(observedProcess); + ProcessExited?.Invoke(this, observedProcess); + } } Thread.Sleep(1000); @@ -81,11 +84,12 @@ namespace Lib.ProcessManaging public void Dispose() { - Processes.Clear(); - _cancellationTokenSource.Cancel(); _cancellationTokenSource.Dispose(); _monitorThread = null; + + lock (_processesLock) + Processes.Clear(); } } } \ No newline at end of file