zoukankan      html  css  js  c++  java
  • 多任务管理类 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
            }
  • 相关阅读:
    app卡顿问题检测--KMCGeigerCounter
    报错---[UIApplication _runWithMainScene:transitionContext:completion:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UIApplication.m:3294**
    键盘工具栏的快速集成--IQKeyboardManager
    iOS 对网络视频采集视频截图
    iOS-label出现未知边框线的bug
    iOS开发中图片方向的获取与更改
    通过代码设置button中文字的对齐方式
    util.date
    统计字符串每个字母的个数
    异常处理之多重catch
  • 原文地址:https://www.cnblogs.com/jinzhao/p/2410191.html
Copyright © 2011-2022 走看看