多任务管理类 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
        }

 

 

转载于:https://www.cnblogs.com/jinzhao/archive/2012/03/21/2410191.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值