- fix monitor method

master
Simon G 5 years ago
parent ccae0f83e0
commit 63b392fa77
  1. 23
      Lib.ProcessManaging/ProcessManager.cs

@ -14,12 +14,15 @@ namespace Lib.ProcessManaging
public class ProcessManager : IProcessManager public class ProcessManager : IProcessManager
{ {
private readonly IObservedProcessFactory _observedProcessFactory; private readonly IObservedProcessFactory _observedProcessFactory;
private readonly CancellationTokenSource _cancellationTokenSource;
private Thread? _monitorThread; private Thread? _monitorThread;
public ProcessManager(IObservedProcessFactory observedProcessFactory) public ProcessManager(IObservedProcessFactory observedProcessFactory)
{ {
_observedProcessFactory = observedProcessFactory; _observedProcessFactory = observedProcessFactory;
_cancellationTokenSource = new CancellationTokenSource();
Processes = new List<IObservedProcess>(); Processes = new List<IObservedProcess>();
} }
@ -27,7 +30,7 @@ namespace Lib.ProcessManaging
public void Initialize() public void Initialize()
{ {
// using ManualResetEvent monitorReadyEvent = new(false); using ManualResetEvent monitorReadyEvent = new(false);
_monitorThread = new Thread(Monitor) _monitorThread = new Thread(Monitor)
{ {
Name = "Process Monitor", Name = "Process Monitor",
@ -35,16 +38,18 @@ namespace Lib.ProcessManaging
}; };
_monitorThread.Start(); _monitorThread.Start();
// monitorReadyEvent.WaitOne(); monitorReadyEvent.WaitOne();
} }
private void Monitor(object? state) private void Monitor(object? state)
{ {
// if (state is not ManualResetEvent monitorReadyEvent) if (state is not ManualResetEvent monitorReadyEvent)
// return; return;
//
// monitorReadyEvent.Set(); monitorReadyEvent.Set();
while (!_cancellationTokenSource.IsCancellationRequested)
{
foreach (var process in Process.GetProcesses()) foreach (var process in Process.GetProcesses())
{ {
if (Processes.Any(p => p.EqualsProcess(process))) if (Processes.Any(p => p.EqualsProcess(process)))
@ -53,7 +58,7 @@ namespace Lib.ProcessManaging
Processes.Add(_observedProcessFactory.Create(process)); Processes.Add(_observedProcessFactory.Create(process));
} }
foreach (IObservedProcess observedProcess in Processes.ToList().Where(p => !Process.GetProcesses().Any(p.EqualsProcess))) foreach (var observedProcess in Processes.ToList().Where(p => !Process.GetProcesses().Any(p.EqualsProcess)))
{ {
Processes.Remove(observedProcess); Processes.Remove(observedProcess);
observedProcess.Dispose(); observedProcess.Dispose();
@ -61,10 +66,14 @@ namespace Lib.ProcessManaging
Thread.Sleep(1000); Thread.Sleep(1000);
} }
}
public void Dispose() public void Dispose()
{ {
Processes.ForEach(p => p.Dispose()); Processes.ForEach(p => p.Dispose());
_cancellationTokenSource.Cancel();
_cancellationTokenSource.Dispose();
_monitorThread = null; _monitorThread = null;
} }
} }

Loading…
Cancel
Save