using System.Collections.Concurrent; namespace SKMC.Api.Common.Tasks { public class TaskTokener { private static readonly ConcurrentDictionary taskTokens = new ConcurrentDictionary(); public static void Add(int id) { if (taskTokens.ContainsKey(id)) { taskTokens.TryRemove(id, out var taskToken); taskToken?.TokenSource.Cancel(); }; taskTokens.TryAdd(id, new TaskToken()); } public static TaskToken GetTaskToken(int id) { if (!taskTokens.ContainsKey(id)) { Add(id); } return taskTokens[id]; } public static void SetWaitPoint(int id) { TaskToken taskToken = GetTaskToken(id); if (taskToken == null) return; taskToken.SetWaitPoint(); } public static bool IsCancelled(int id) { TaskToken taskToken = GetTaskToken(id); if (taskToken == null) return true; bool result = taskToken.TokenSource.IsCancellationRequested; return result; } public static void Pause(int id) { TaskToken taskToken = GetTaskToken(id); if (taskToken == null) return; taskToken.ResetEvent.Reset(); } public static void PauseAll() { foreach (int stationId in taskTokens.Keys) { Pause(stationId); } } public static void Resume(int id) { TaskToken taskToken = GetTaskToken(id); if (taskToken == null) return; taskToken.ResetEvent.Set(); } public static void ResumeAll() { foreach (int station in taskTokens.Keys) { Resume(station); } } public static void Stop(int id) { TaskToken taskToken = GetTaskToken(id); if (taskToken == null) return; taskToken.TokenSource.Cancel(); taskToken.ResetEvent.Set(); } public static void StopAll() { foreach (int stationId in taskTokens.Keys) { Stop(stationId); } } public static void RestoreAll() { foreach (int stationId in taskTokens.Keys) { TaskToken taskToken = GetTaskToken(stationId); if (taskToken == null) continue; Add(stationId); } } } }