多任务管理类 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 = 8int 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 = 8int 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
        }
复制代码

 

 

posted @   today4king  阅读(440)  评论(0编辑  收藏  举报
编辑推荐:
· 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 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示
主题色彩