using AmrControl.Common; using AmrControl.JGR; using System.Collections.Concurrent; namespace AmrControl.services { public class TaskExecManager : ITaskExecManager { /// /// 任务列表 /// private ConcurrentQueue> tasks = new(); /// /// 进行中的任务 /// private volatile string? curTaskId; /// /// 运行状态 /// private volatile bool _running; /// /// 完成任务列表 /// private volatile List completedTasks = new(); /// /// 锁对象 /// Mutex mutex = new Mutex(); private static volatile TaskExecManager Instance = null; public TaskExecManager() { Instance = this; } public static ITaskExecManager getInstance() { return Instance; } /// /// 添加任务 /// /// /// public void addTask(Proxy proxy, string taskId) { tasks.Enqueue(new Dictionary() { { taskId, proxy } }); } /// /// 检查任务是否完成 /// /// /// public bool checkTaskIsCompleted(string taskId) { try { mutex.WaitOne(); return completedTasks.Remove(taskId); } finally { mutex.ReleaseMutex(); } } /// /// 生成任务id /// /// public string genTaskId() { return Guid.NewGuid().ToString(); } /// /// 通知任务完成 /// /// /// public void notifyTaskCompleted(string taskId) { try { mutex.WaitOne(); completedTasks.Add(taskId); } finally { mutex.ReleaseMutex(); } } public void start() { if (!_running) { _running = true; startTask(); } } public void stop() { //修改运行状态标识 _running = false; } async void startTask() { while (_running) { Dictionary taskDic = null; _ = tasks.TryDequeue(out taskDic); if (taskDic != null) { try { curTaskId = taskDic.Keys.First(); //将当前任务id放入线程上下文 ThreadLocalManager.Set(new ThreadLocalContext() { taskId = curTaskId }); taskDic[curTaskId].Invoke(); ////等待任务完成 //do //{ // await Task.Delay(TimeSpan.FromMilliseconds(300)); //} while (!checkTaskIsCompleted(curTaskId)); } catch (Exception ex) { Console.WriteLine($"执行任务产生异常,异常原因:${ex.Message}"); } //finally //{ // ThreadLocalManager.Remove(); //} } else { await Task.Delay(TimeSpan.FromMilliseconds(300)); } } } } }