- remove manual reset event
master
Simon G 5 years ago
parent f3e1decd82
commit ed0ce0497f
  1. 26
      Lib.ProcessManaging/ProcessManager.cs

@ -17,6 +17,8 @@ namespace Lib.ProcessManaging
private readonly IObservedProcessFactory _observedProcessFactory; private readonly IObservedProcessFactory _observedProcessFactory;
private readonly CancellationTokenSource _cancellationTokenSource; private readonly CancellationTokenSource _cancellationTokenSource;
private readonly object _processesLock = new();
private Thread? _monitorThread; private Thread? _monitorThread;
public ProcessManager(IObservedProcessFactory observedProcessFactory) public ProcessManager(IObservedProcessFactory observedProcessFactory)
@ -31,26 +33,26 @@ namespace Lib.ProcessManaging
public void Initialize() public void Initialize()
{ {
using ManualResetEvent monitorReadyEvent = new(false);
_monitorThread = new Thread(Monitor) _monitorThread = new Thread(Monitor)
{ {
Name = "Process Monitor", Name = "Process Monitor",
IsBackground = true IsBackground = true
}; };
_monitorThread.Start(monitorReadyEvent); _monitorThread.Start();
monitorReadyEvent.WaitOne();
} }
public IObservedProcess? GetProcessById(int id) => Processes.FirstOrDefault(p => p.Id == id); public IObservedProcess? GetProcessById(int id)
private void Monitor(object? state)
{ {
if (state is not ManualResetEvent monitorReadyEvent) lock (_processesLock)
return; return Processes.FirstOrDefault(p => p.Id == id);
}
monitorReadyEvent.Set();
private void Monitor()
{
while (!_cancellationTokenSource.IsCancellationRequested) while (!_cancellationTokenSource.IsCancellationRequested)
{
lock (_processesLock)
{ {
IEnumerable<Process> processes = Process.GetProcesses(); IEnumerable<Process> processes = Process.GetProcesses();
foreach (var process in processes) foreach (var process in processes)
@ -71,6 +73,7 @@ namespace Lib.ProcessManaging
Processes.Remove(observedProcess); Processes.Remove(observedProcess);
ProcessExited?.Invoke(this, observedProcess); ProcessExited?.Invoke(this, observedProcess);
} }
}
Thread.Sleep(1000); Thread.Sleep(1000);
} }
@ -81,11 +84,12 @@ namespace Lib.ProcessManaging
public void Dispose() public void Dispose()
{ {
Processes.Clear();
_cancellationTokenSource.Cancel(); _cancellationTokenSource.Cancel();
_cancellationTokenSource.Dispose(); _cancellationTokenSource.Dispose();
_monitorThread = null; _monitorThread = null;
lock (_processesLock)
Processes.Clear();
} }
} }
} }
Loading…
Cancel
Save