|
|
|
|
@ -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; |
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|
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(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |