- remove manual reset event
master
Simon G 5 years ago
parent f3e1decd82
commit ed0ce0497f
  1. 60
      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<Process> processes = Process.GetProcesses();
foreach (var process in processes)
lock (_processesLock)
{
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);
}
foreach (var observedProcess in Processes.ToList().Where(p => !processes.Any(p.EqualsProcess)))
{
Processes.Remove(observedProcess);
ProcessExited?.Invoke(this, observedProcess);
IEnumerable<Process> 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);
}
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();
}
}
}
Loading…
Cancel
Save