当前位置: 首页 > news >正文

c# LazyQueueT实现

有时候,当任务比较多的时候,需要做一个队列。当队列数量达到一定数量时候,进行出队并处理,但是如果很长时间都没有达到那个数量呢?那就加一个时间限制,例如30分钟,1000个元素,哪一个条件先达到都会执行出队操作。


LazyQueue<T>类的实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;


namespace ServerToolServer.Util
{


    /// <summary>
    /// 到指定的秒数或到达某个数量执行出队
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public class LazyQueue<T>
    {


        /// <summary>
        /// 当前的队列
        /// </summary>
        private Queue<T> _current;


        /// <summary>
        /// 回调,当时间达到maxSec或_curentQueue达到maxNum数量时,执行
        /// </summary>
        private Action<T[]> _dequeueAction;


        /// <summary>
        /// 队列的最大数量
        /// </summary>
        private int _maxNum;


        /// <summary>
        /// 监听队列的线程
        /// </summary>
        private Thread _executeThread;


        /// <summary>
        /// 当前秒数
        /// </summary>
        private int _currentSec = 0;


        /// <summary>
        /// 最大秒数,就执行这个方法
        /// </summary>
        private int _maxSec;


        /// <summary>
        /// 构造器
        /// </summary>
        /// <param name="sec">最迟的执行秒数</param>
        /// <param name="num">队列的最大数量</param>
        /// <param name="dequeueAction">出队函数</param>
        public LazyQueue(int sec, int num, Action<T[]> dequeueAction)
        {
            this._maxSec = sec;
            this._maxNum = num;
            this._dequeueAction = dequeueAction;
            this._current = new Queue<T>();
            this._currentSec = 0;


            _executeThread = new Thread(new ThreadStart(() =>
            {
                while (true)
                {
                    this._currentSec++;
                    if (this._current.Count >= _maxNum || this._currentSec >= _maxSec)
                    {
                        this._dequeueAction.Invoke(this._current.ToArray());
                        
                        别忘了清空队列和秒数
                        this._current.Clear();
                        this._currentSec = 0;
                    }
                    每秒检测一下队列的数量和秒数
                    Thread.Sleep(1000);
                }
            }));
            this._executeThread.Start();


        }


        /// <summary>
        /// 入队
        /// </summary>
        /// <param name="value"></param>
        public void Enqueue(T value)
        {
            this._current.Enqueue(value);
        }


        /// <summary>
        /// 出队
        /// </summary>
        /// <returns></returns>
        public T Dequeue()
        {
            return this._current.Dequeue();
        }


        /// <summary>
        /// 清缓存
        /// </summary>
        public void Flush()
        {
            this._maxSec = 0;
            this._maxNum = 0;
            this._currentSec = 0;
            this._dequeueAction = null;
            this._current.Clear();
            this._executeThread.Abort();
        }


    }
}


相关文章:

  • Windows NT/2k/XP/Vista 管理员密码重置
  • c# 使用sharppcap实现 网络抓包
  • 数学之美系列十六(上)- 不要把所有的鸡蛋放在一个篮子里 -- 谈谈最大熵模型
  • [Web开发] 如何改变IE滚动条的颜色
  • sql 选择两列中最大的那列
  • 解读CNNIC《中国手机上网行为研究报告》
  • ms sql常用语句汇总
  • 把表变成编辑状态
  • sql server 数据库语句
  • WoWModelViewer分析
  • 彩云项目总结
  • jquery 特效整合
  • 奇怪,博客无法匿名评论了
  • js获取屏幕大小
  • 术业有专攻,尽好本分最重要
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 10个最佳ES6特性 ES7与ES8的特性
  • Docker下部署自己的LNMP工作环境
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • linux安装openssl、swoole等扩展的具体步骤
  • Netty源码解析1-Buffer
  • Shell编程
  • 大快搜索数据爬虫技术实例安装教学篇
  • 关于Flux,Vuex,Redux的思考
  • 湖南卫视:中国白领因网络偷菜成当代最寂寞的人?
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 面试总结JavaScript篇
  • 使用Gradle第一次构建Java程序
  • 手机端车牌号码键盘的vue组件
  • 微服务框架lagom
  • 正则表达式小结
  • 06-01 点餐小程序前台界面搭建
  • k8s使用glusterfs实现动态持久化存储
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • $.proxy和$.extend
  • (12)Hive调优——count distinct去重优化
  • (13):Silverlight 2 数据与通信之WebRequest
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)JAVA使用POI操作excel
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (十一)手动添加用户和文件的特殊权限
  • (学习日记)2024.02.29:UCOSIII第二节
  • (译)2019年前端性能优化清单 — 下篇
  • (转)LINQ之路
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • (转载)(官方)UE4--图像编程----着色器开发
  • ****** 二十三 ******、软设笔记【数据库】-数据操作-常用关系操作、关系运算
  • ./configure,make,make install的作用(转)
  • .h头文件 .lib动态链接库文件 .dll 动态链接库