- fix monitor method

master
Simon G 5 years ago
parent ccae0f83e0
commit 63b392fa77
  1. 45
      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<IObservedProcess>();
}
@ -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;
}
}

Loading…
Cancel
Save