using System.Collections.Concurrent; namespace SKMC.Api.Common.Tasks { /// /// TaskToken(任务执行控制令牌)容器 /// 用于管理多个TaskToken相关的线程执行暂停、恢复、停止 /// public class TaskTokener { private static readonly ConcurrentDictionary taskTokens = new ConcurrentDictionary(); /// /// 创建一个TaskToken /// /// TaskToken的Id public static TaskToken Add(int id) { if (taskTokens.ContainsKey(id)) { taskTokens.TryRemove(id, out var taskTokenGet); taskTokenGet?.Cancel(); }; TaskToken taskTokenNew = new TaskToken { Id = id }; bool result = taskTokens.TryAdd(id, taskTokenNew); if (result) return taskTokenNew; return null; } /// /// 重新创建所有的TaskToken /// public static void AddAll() { foreach (int stationId in taskTokens.Keys) { TaskToken taskToken = GetTaskToken(stationId); if (taskToken == null) continue; Add(stationId); } } /// /// 根据Id获取TaskToken /// /// TaskToken的Id /// public static TaskToken GetTaskToken(int id) { if (!taskTokens.ContainsKey(id)) { Add(id); } return taskTokens[id]; } /// /// 设置TaskToken中断点(在Stop之前有效) /// /// public static void SetWaitPoint(int id) => SetWaitPoint(GetTaskToken(id)); /// /// 设置TaskToken中断点(在Stop之前有效) /// /// public static void SetWaitPoint(TaskToken taskToken) { if (taskToken == null) return; taskToken.SetWaitPoint(); } /// /// TaskToken是否已取消/停止 /// /// /// public static bool IsCancelled(int id) => IsCancelled(GetTaskToken(id)); /// /// TaskToken是否已取消/停止 /// /// /// public static bool IsCancelled(TaskToken taskToken) { if (taskToken == null) return true; return taskToken.IsCancelled(); } /// /// 暂停TaskToken /// /// public static void Pause(int id) => Pause(GetTaskToken(id)); /// /// 暂停TaskToken /// /// public static void Pause(TaskToken taskToken) { if (taskToken == null) return; taskToken.Pause(); } /// /// 暂停所有的TaskToken /// public static void PauseAll() { foreach (int stationId in taskTokens.Keys) { Pause(stationId); } } /// /// 恢复TaskToken /// /// public static void Resume(int id) => Resume(GetTaskToken(id)); /// /// 恢复TaskToken /// /// public static void Resume(TaskToken taskToken) { if (taskToken == null) return; taskToken.Resume(); } /// /// 恢复所有的TaskToken /// public static void ResumeAll() { foreach (int station in taskTokens.Keys) { Resume(station); } } /// /// 停止TaskToken /// /// public static void Stop(int id) => Stop(GetTaskToken(id)); /// /// 停止TaskToken /// /// public static void Stop(TaskToken taskToken) { if (taskToken == null) return; taskToken.Stop(); //taskTokens.TryRemove(taskToken.Id, out _); } /// /// 停止所有的TaskToken /// public static void StopAll() { foreach (int stationId in taskTokens.Keys) { Stop(stationId); } } } }