Process Monitor - simplified structure, moved everything to Core

This commit is contained in:
Diogo Trindade committed 2021-03-10 15:35:27 +00:00
1 parent c9ee37ece8
commit fb51e75b94
6 files changed
+35 -121

No files matched your search

@@ -9,13 +9,10 @@ namespace Artemis.Core.Services
{
public interface IProcessMonitorService : IArtemisService
{
void AddProcessWatcher(ProcessWatcher provider);
void RemoveProcessWatcher(ProcessWatcher provider);
IEnumerable<string> GetRunningProcesses();
event EventHandler<ProcessEventArgs> ProcessStarted;
event EventHandler<ProcessEventArgs> ProcessStopped;
IEnumerable<string> GetRunningProcesses();
}
}
@@ -1,46 +1,52 @@
using System;
using Serilog;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Timers;
namespace Artemis.Core.Services
{
public class ProcessMonitorService : IProcessMonitorService
{
private readonly List<ProcessWatcher> _watchers = new List<ProcessWatcher>();
private readonly ILogger _logger;
private readonly Timer _processScanTimer;
private IEnumerable<string> _lastScannedProcesses;
public ProcessMonitorService(ILogger logger)
{
_logger = logger;
_lastScannedProcesses = Process.GetProcesses().Select(p => p.ProcessName).Distinct().ToArray();
_processScanTimer = new Timer(1000);
_processScanTimer.Elapsed += OnTimerElapsed;
_processScanTimer.Start();
}
public event EventHandler<ProcessEventArgs> ProcessStarted;
public event EventHandler<ProcessEventArgs> ProcessStopped;
public void AddProcessWatcher(ProcessWatcher watcher)
{
watcher.ProcessStarted += ProviderOnProcessStarted;
watcher.ProcessStopped += ProviderOnProcessStopped;
_watchers.Add(watcher);
}
public void RemoveProcessWatcher(ProcessWatcher watcher)
{
if (!_watchers.Contains(watcher))
return;
_watchers.Remove(watcher);
watcher.ProcessStarted -= ProviderOnProcessStarted;
watcher.ProcessStopped -= ProviderOnProcessStopped;
}
public IEnumerable<string> GetRunningProcesses()
{
return _watchers.SelectMany(w => w.GetRunningProcesses());
return _lastScannedProcesses;
}
private void ProviderOnProcessStopped(object? sender, ProcessEventArgs e)
private void OnTimerElapsed(object sender, ElapsedEventArgs e)
{
ProcessStopped?.Invoke(this, e);
}
var newProcesses = Process.GetProcesses().Select(p => p.ProcessName).Distinct();
foreach (var startedProcess in newProcesses.Except(_lastScannedProcesses))
{
ProcessStarted?.Invoke(this, new ProcessEventArgs(startedProcess));
_logger.Verbose("Started Process: {startedProcess}", startedProcess);
}
private void ProviderOnProcessStarted(object? sender, ProcessEventArgs e)
{
ProcessStarted?.Invoke(this, e);
foreach (var stoppedProcess in _lastScannedProcesses.Except(newProcesses))
{
ProcessStopped?.Invoke(this, new ProcessEventArgs(stoppedProcess));
_logger.Verbose("Stopped Process: {stoppedProcess}", stoppedProcess);
}
_lastScannedProcesses = newProcesses.ToArray();
}
}
}
@@ -1,26 +0,0 @@
using System;
using System.Collections.Generic;
namespace Artemis.Core.Services
{
/// <summary>
/// Class that provides info on running processes, including events on event start and stop
/// </summary>
public abstract class ProcessWatcher
{
public event EventHandler<ProcessEventArgs> ProcessStarted;
public event EventHandler<ProcessEventArgs> ProcessStopped;
public abstract IEnumerable<string> GetRunningProcesses();
public virtual void OnProcessStarted(string processName)
{
ProcessStarted?.Invoke(this, new ProcessEventArgs(processName));
}
public virtual void OnProcessStopped(string processName)
{
ProcessStopped?.Invoke(this, new ProcessEventArgs(processName));
}
}
}