/// <summary> /// Запустить добавление новых процессов для мониторинга /// </summary> /// <param name="cancellationToken"></param> private Task RunAddingNewObservedProcesses(CancellationToken cancellationToken) => Task.Run(() => { while (!cancellationToken.IsCancellationRequested) { // получаем список имен активных процессов var activeProcessNames = _observedProcesses.Values.Select(s => s.ProcessState.ProcessName); // берем только новые var newProcesses = Process.GetProcesses() .Where(x => !activeProcessNames.Contains(x.ProcessName)); foreach (var currentProcess in newProcesses) { // создаем обработчик процесса var processHandler = new TProcessStateHandler() .Initialize(currentProcess.Id, currentProcess.ProcessName); if (!_observedProcesses.TryAdd(currentProcess.ProcessName, processHandler)) { continue; } // оповещаем о старте наблюдения за процессом _messageProcessor.Publish(new ProcessObserveOpenEvent(processHandler.ProcessState)); // подписываемся на событие обновления состояния процесса processHandler.OnStateRefreshed += OnProcessStateUpdate; // подписываемся на события для завершение наблюдения processHandler.OnClosed += OnCloseProcess; currentProcess.Disposed += OnCloseProcess; } } }, cancellationToken);