96 lines
2.6 KiB
C#
96 lines
2.6 KiB
C#
|
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();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|