多任务管理类 MutilTaskManager
计算和计算所需的数据能被较为平均的非配到若干task的时候,下面的任务管理类可以提供在大数据大计算量的情况下非精确的控制task的执行数量来限制计算量和内存占用量.
下面是代码(非线程安全版本):
public class MutilTaskManager
{
private readonly int _maxRun;
private readonly int _maxQuenen;
private List<Task> _taskRunningList;
private readonly Queue<Task> _taskQueue;
public bool IsQueueFull
{
get { return _taskQueue.Count > _maxQuenen; }
}
public MutilTaskManager(int maxRun = 8, int maxQuenen = 2)
{
_maxRun = maxRun;
_maxQuenen = maxQuenen;
_taskRunningList = new List<Task>(maxRun);
_taskQueue = new Queue<Task>(2);
}
public void TakeBooting(int sleepTime = 10)
{
if (_taskRunningList.Count >= _maxRun)
{
_taskRunningList = _taskRunningList.Where(it => !it.IsCompleted).ToList();
}
while (_taskRunningList.Count < _maxRun && _taskQueue.Count > 0)
{
var t = _taskQueue.Dequeue();
_taskRunningList.Add(t);
t.Start();
}
System.Threading.Thread.Sleep(sleepTime);
}
public void Enqueue(Task task)
{
_taskQueue.Enqueue(task);
TakeBooting(0);
}
public void WaitAll()
{
while (_taskQueue.Count > 0)
{
TakeBooting();
}
Task.WaitAll(_taskRunningList.ToArray());
}
}
{
private readonly int _maxRun;
private readonly int _maxQuenen;
private List<Task> _taskRunningList;
private readonly Queue<Task> _taskQueue;
public bool IsQueueFull
{
get { return _taskQueue.Count > _maxQuenen; }
}
public MutilTaskManager(int maxRun = 8, int maxQuenen = 2)
{
_maxRun = maxRun;
_maxQuenen = maxQuenen;
_taskRunningList = new List<Task>(maxRun);
_taskQueue = new Queue<Task>(2);
}
public void TakeBooting(int sleepTime = 10)
{
if (_taskRunningList.Count >= _maxRun)
{
_taskRunningList = _taskRunningList.Where(it => !it.IsCompleted).ToList();
}
while (_taskRunningList.Count < _maxRun && _taskQueue.Count > 0)
{
var t = _taskQueue.Dequeue();
_taskRunningList.Add(t);
t.Start();
}
System.Threading.Thread.Sleep(sleepTime);
}
public void Enqueue(Task task)
{
_taskQueue.Enqueue(task);
TakeBooting(0);
}
public void WaitAll()
{
while (_taskQueue.Count > 0)
{
TakeBooting();
}
Task.WaitAll(_taskRunningList.ToArray());
}
}
线程安全版本:
public class MutilTaskManager
{
private readonly int _maxRun;
private readonly int _maxQuenen;
private List<Task> _taskRunningList;
private readonly Queue<Task> _taskQueue;
private object _lockObj = new object();
public bool IsQueueFull
{
get { return _taskQueue.Count > _maxQuenen; }
}
public MutilTaskManager(int maxRun = 8, int maxQuenen = 2)
{
_maxRun = maxRun;
_maxQuenen = maxQuenen;
_taskRunningList = new List<Task>(maxRun);
_taskQueue = new Queue<Task>(2);
}
public void TakeBooting(int sleepTime = 10)
{
lock (_lockObj)
{
if (_taskRunningList.Count >= _maxRun)
{
_taskRunningList = _taskRunningList.Where(it => !it.IsCompleted).ToList();
}
while (_taskRunningList.Count < _maxRun && _taskQueue.Count > 0)
{
var t = _taskQueue.Dequeue();
_taskRunningList.Add(t);
t.Start();
}
}
System.Threading.Thread.Sleep(sleepTime);
}
public void Enqueue(Task task)
{
lock (_lockObj)
{
_taskQueue.Enqueue(task);
}
TakeBooting(0);
}
public void WaitAll()
{
while (_taskQueue.Count > 0)
{
TakeBooting();
}
Task.WaitAll(_taskRunningList.ToArray());
}
}
{
private readonly int _maxRun;
private readonly int _maxQuenen;
private List<Task> _taskRunningList;
private readonly Queue<Task> _taskQueue;
private object _lockObj = new object();
public bool IsQueueFull
{
get { return _taskQueue.Count > _maxQuenen; }
}
public MutilTaskManager(int maxRun = 8, int maxQuenen = 2)
{
_maxRun = maxRun;
_maxQuenen = maxQuenen;
_taskRunningList = new List<Task>(maxRun);
_taskQueue = new Queue<Task>(2);
}
public void TakeBooting(int sleepTime = 10)
{
lock (_lockObj)
{
if (_taskRunningList.Count >= _maxRun)
{
_taskRunningList = _taskRunningList.Where(it => !it.IsCompleted).ToList();
}
while (_taskRunningList.Count < _maxRun && _taskQueue.Count > 0)
{
var t = _taskQueue.Dequeue();
_taskRunningList.Add(t);
t.Start();
}
}
System.Threading.Thread.Sleep(sleepTime);
}
public void Enqueue(Task task)
{
lock (_lockObj)
{
_taskQueue.Enqueue(task);
}
TakeBooting(0);
}
public void WaitAll()
{
while (_taskQueue.Count > 0)
{
TakeBooting();
}
Task.WaitAll(_taskRunningList.ToArray());
}
}
使用示例:
void Test()
{
var mtm = new MutilTaskManager();
foreach(int i in(new int[10]))
{
while (mtm.IsQueueFull)
{
mtm.TakeBooting();
}
mtm.Enqueue(new Task(myTask));
}
}
void myTask()
{
//read data
//do something
}
{
var mtm = new MutilTaskManager();
foreach(int i in(new int[10]))
{
while (mtm.IsQueueFull)
{
mtm.TakeBooting();
}
mtm.Enqueue(new Task(myTask));
}
}
void myTask()
{
//read data
//do something
}
作者:today4king
出处:https://www.cnblogs.com/jinzhao/archive/2012/03/21/2410191.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架