You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.7 KiB
C#
130 lines
3.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Txgy.EWS.Client.Common
|
|
{
|
|
public class TaskQueue
|
|
{
|
|
/// <summary>
|
|
/// 任务队列
|
|
/// </summary>
|
|
private Queue<TaskData> QueuesTask = new Queue<TaskData>();
|
|
public List<Task> tasks { get; set; } = new List<Task>();
|
|
/// <summary>
|
|
/// 任务队列是否在执行中
|
|
/// </summary>
|
|
private bool isExecuteing = false;
|
|
|
|
private static TaskQueue _instance = null;
|
|
public static TaskQueue Instance
|
|
{
|
|
get
|
|
{
|
|
if (_instance == null)
|
|
_instance = new TaskQueue();
|
|
return _instance;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 任务是否进行中
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
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);
|
|
}
|
|
/// <summary>
|
|
/// 添加任务,任务会按照队列自动执行
|
|
/// </summary>
|
|
/// <param name="task"></param>
|
|
public void AddTaskAndRuning(TaskData taskData)
|
|
{
|
|
if (taskData == null) return;
|
|
|
|
QueuesTask.Enqueue(taskData);
|
|
|
|
StartPerformTask();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 执行任务
|
|
/// </summary>
|
|
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
|
|
{
|
|
/// <summary>
|
|
/// 任务名
|
|
/// </summary>
|
|
public string Name { get; set; }
|
|
/// <summary>
|
|
/// 任务
|
|
/// </summary>
|
|
public Task Tasks { get; set; }
|
|
/// <summary>
|
|
/// 任务完成后的回调
|
|
/// </summary>
|
|
public Action<string> CallBack { get; set; }
|
|
public string FilePath { get; set; }
|
|
public bool IsComplete { get; set; } = false;
|
|
public string EventTimeStr { get; set; }
|
|
/// <summary>
|
|
/// 任务开始时间
|
|
/// </summary>
|
|
public DateTime BeginTime { get; set; }
|
|
/// <summary>
|
|
/// 任务结束时间
|
|
/// </summary>
|
|
public DateTime EndTime { get; set; }
|
|
}
|
|
}
|