using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; using Newtonsoft.Json; using Sers.Core.Module.App; using Vit.Core.Util.ConfigurationManager; using Vit.Core.Util.Threading.Worker; namespace App.Robot.Station.Logical { public class TaskMng { /// /// 主线程开启的常驻线程,用以启动api触发的任务。 /// 若在api中直接调用,则会导致 ApiClient中 RpcData错乱的问题 /// (RpcData通过AsyncCache保存api调用关系,故若api中直接开启线程调用api,可能会出现api中的 RpcData错乱)。 /// public static readonly TaskQueue MainTask = new TaskQueue() { threadName = "Robot-MainTaskToStartTask" }; public static readonly TaskMng Instance; static TaskMng() { //TaskController.MainTask SersApplication.onStart += () => MainTask.Start(); SersApplication.onStop += () => MainTask.Stop(); Instance = JsonFile.GetFromFile(new[] { "Data", "App.Robot.json" }) ; if (null == Instance) { Instance = new TaskMng(); } MainTask.AddTask(() => { Thread.Sleep(2000); Instance.tasks.Values.Where(m => m.config.autoStart).ToList().ForEach(task => task.worker.Start()); }); if (SersApplication.IsRunning) Task.Run(MainTask.Start); } public void TaskMngSaveToCache() { JsonFile.SetToFile(this, new[] { "Data", "App.Robot.json" }); } [JsonProperty] ConcurrentDictionary tasks = new ConcurrentDictionary(); public bool Add(TaskConfig config) { lock (this) { var id = 1; if (tasks.Count != 0) { id = tasks.Keys.Max() + 1; } TaskItem taskItem = new TaskItem { config = config, id = id }; if (!tasks.TryAdd(id, taskItem)) { return false; } if (config.autoStart) { MainTask.AddTask(() => { taskItem.worker.Start(); }); } TaskMngSaveToCache(); return true; } } public bool Start(int id) { if (tasks.TryGetValue(id, out var taskItem)) { MainTask.AddTask(() => { taskItem.worker.Start(); }); return true; } return false; } public bool Stop(int id) { if (tasks.TryGetValue(id, out var task)) { task.worker.Stop(); return true; } return false; } public bool Remove(int id) { if (tasks.TryGetValue(id, out var task)) { task.worker.Stop(); tasks.TryRemove(id, out _); TaskMngSaveToCache(); return true; } return false; } public List GetAll() { return tasks.Values.ToList(); } } }