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; }
}
}