/// <summary> /// Launches the guardian Thread and overwrites a possible existing one. /// </summary> /// <returns></returns> public static bool LaunchGuardian(HashSet <GuardianTask> initialTasks, object[] parameters) { try { _taskPool = new ConcurrentDictionary <GTIdentifier, GuardianTask>(); _upcomingTasks = new HashSet <GTIdentifier>(); // Add the intial tasks foreach (var task in initialTasks) { AddTask(task); } UtilityParameters.HandleFortressParameters(parameters); _guardianThread = new Thread(new ThreadStart(GuardianThread)) { Name = "GUARDIAN_THREAD", IsBackground = true }; _guardianIsRunning = true; // Call this before starting the thread! _guardianThread.Start(); GuardianStarted?.Invoke(); return(true); } catch (Exception ex) { GuardianThrewException?.Invoke(ex, "Couldn't launch the guardian."); return(false); } }
/// <summary> /// Makes the guardian reloads it's task pool with the given List /// </summary> public static void ReloadTasks(HashSet <GuardianTask> initialTasks) { try { _taskPool.Clear(); foreach (var task in initialTasks) { AddTask(task); } } catch (Exception ex) { GuardianThrewException?.Invoke(ex, "There was an error reloading your scheduled configs."); } }
/// <summary> /// Stops the gurdian. /// </summary> /// <returns></returns> public static bool StopGuardian(bool supressMessage = false) { try { _guardianIsRunning = false; _taskPool.Clear(); _upcomingTasks.Clear(); if (!supressMessage) { GuardianStopped?.Invoke("Guardian has been manually stopped."); } return(true); } catch (Exception ex) { GuardianThrewException?.Invoke(ex, "Couldn't stop the guardian."); return(false); } }
/// <summary> /// The continous thread that stays in the background and completes task after task. /// </summary> private static void GuardianThread() { lock (_lock) { try { while (_guardianIsRunning) { CheckUpcomingTasks(); if (_upcomingTasks.Count > 0) { // Take the next possible task var nextTask = _upcomingTasks.FirstOrDefault(t => t.ExecutionDate <= DateTime.Now); if (nextTask != default) { //Handle the task now! if (_taskPool.TryGetValue(nextTask, out var task)) { HandleTask(task); } else { ;// Inform someone that a task is missing. } } } // Maybe let the user decide the frequency of the Guardian later. Thread.Sleep(1000); } } catch (Exception ex) { GuardianThrewException?.Invoke(ex, ex.Message); GuardianStopped?.Invoke($"The guardian detected an error and has been shut down. " + $"After the error has been fixed, try to restart him manually via the Home-Hub. {Environment.NewLine}" + $"Error: {ex.Message}"); } } }