old_flsystem/类库/Api.Framework/Tools/TaskTool.cs

96 lines
2.6 KiB
C#
Raw Normal View History

2022-09-20 03:10:29 +00:00
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Api.Framework.Utils
{
public class TaskTool
{
/// <summary>
/// 最大并发
/// </summary>
private int max_run { get; set; }
/// <summary>
/// 任务管理器
/// </summary>
public List<Task> Tasks { get; private set; }
/// <summary>
/// 创建线程池
/// </summary>
/// <param name="max_run"></param>
public TaskTool()
{
this.Tasks = new List<Task>();
}
/// <summary>
/// 增加任务
/// </summary>
/// <param name="method"></param>
public void AddTask(Action method)
{
Tasks.Add(new Task(method));
}
/// <summary>
/// 执行线程池内所有线程
/// </summary>
/// <param name="max_sync">最大并行线程数量</param>
/// <param name="callback">执行完成后通知</param>
public void Start(int max_sync, AsyncCallback callback)
{
DateTime start_Time = DateTime.Now;
Action action = delegate ()
{
//循环几次
var _count = Tasks.Count / max_sync; if (Tasks.Count % max_sync != 0) _count++;
for (int i = 0; i < _count; i++)
{
List<Task> _runs = new List<Task>();
for (int j = i * max_sync; j < Tasks.Count && _runs.Count < max_sync; j++)
{
var task = Tasks[j];
_runs.Add(task);
task.Start();
}
Task.WaitAll(_runs.ToArray());
}
};
if (callback == null) action.Invoke();
else action.BeginInvoke(callback, null);
}
public void Clear()
{
this.Tasks.Clear();
}
}
public static class TaskExtend
{
/// <summary>
/// 不卡界面休眠
/// </summary>
/// <param name="obj">源</param>
/// <param name="millisecondsTimeout">毫秒</param>
public static void Sleep(this object obj, int millisecondsTimeout)
{
System.Threading.Thread t = new System.Threading.Thread(o => System.Threading.Thread.Sleep(millisecondsTimeout));
t.Start(obj);
while (t.IsAlive)
{
System.Windows.Forms.Application.DoEvents();
}
}
}
}