Maison > développement back-end > Tutoriel C#.Net > c# Implémentation de LazyQueue

c# Implémentation de LazyQueue

黄舟
Libérer: 2017-03-02 13:14:41
original
1682 Les gens l'ont consulté

Parfois, lorsqu'il y a de nombreuses tâches, vous devez créer une file d'attente. Lorsque le nombre de files d'attente atteint un certain nombre, elles sont retirées de la file d'attente et traitées, mais que se passe-t-il si ce nombre n'est pas atteint pendant une longue période ? Ajoutez ensuite une limite de temps, telle que 30 minutes, 1 000 éléments, et la première condition atteinte sera retirée de la file d'attente.

Implémentation de la classe LazyQueue :

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();
        }


    }
}
Copier après la connexion

Ce qui précède est le contenu implémenté par c# LazyQueue. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (. www.php.cn) !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal