using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Txgy.EWS.Client.Common { public class TaskQueue { /// /// 任务队列 /// private Queue QueuesTask = new Queue(); public List tasks { get; set; } = new List(); /// /// 任务队列是否在执行中 /// private bool isExecuteing = false; private static TaskQueue _instance = null; public static TaskQueue Instance { get { if (_instance == null) _instance = new TaskQueue(); return _instance; } } /// /// 任务是否进行中 /// /// public bool IsTasking() { return isExecuteing; } public int TaskCancel() { isExecuteing = false; //Console.WriteLine($"------------------未完成任务:{tasks.Count}"); Task.WaitAll(tasks.ToArray()); //Console.WriteLine($"------------------未完成任务:{tasks.Count}"); return tasks.Count(ta => ta.Status == TaskStatus.Running); } /// /// 添加任务,任务会按照队列自动执行 /// /// public void AddTaskAndRuning(TaskData taskData) { if (taskData == null) return; QueuesTask.Enqueue(taskData); StartPerformTask(); } /// /// 执行任务 /// private async void StartPerformTask() { if (isExecuteing) { return; } while (QueuesTask.Count > 0) { isExecuteing = true; await Task.Run(() => { TaskData taskDatas = QueuesTask.Dequeue(); Task task = taskDatas.Tasks; tasks.Add(task); taskDatas.BeginTime = DateTime.Now; task.Start(); task.Wait(); if (taskDatas.CallBack != null) taskDatas.CallBack((DateTime.Now - taskDatas.BeginTime).TotalMilliseconds.ToString()); }); } isExecuteing = false; } private TaskQueue() { } ~TaskQueue() { try { isExecuteing = false; //Console.WriteLine($"------------------未完成任务:{tasks.Count(ta=>ta.Status==TaskStatus.Running)}"); Task.WaitAll(tasks.ToArray()); //Console.WriteLine($"------------------未完成任务:{tasks.Count(ta => ta.Status == TaskStatus.Running)}"); } catch { } } } public class TaskData { /// /// 任务名 /// public string Name { get; set; } /// /// 任务 /// public Task Tasks { get; set; } /// /// 任务完成后的回调 /// public Action CallBack { get; set; } public string FilePath { get; set; } public bool IsComplete { get; set; } = false; public string EventTimeStr { get; set; } /// /// 任务开始时间 /// public DateTime BeginTime { get; set; } /// /// 任务结束时间 /// public DateTime EndTime { get; set; } } }