C# LazyQueue 구현

黄舟
黄舟원래의
2017-03-02 13:14:411619검색

때로는 작업이 많을 때 대기열을 생성해야 할 때가 있습니다. Queue의 개수가 일정 개수에 도달하면 Dequeue되어 처리되는데, 오랫동안 그 개수에 도달하지 못하면 어떻게 될까요? 그런 다음 30분, 1000개 요소 등의 시간 제한을 추가하면 먼저 도달한 조건이 대기열에서 제거됩니다.

LazyQueue8742468051c85b06f0a0af9e3e506b5c 클래스 구현:

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


    }
}

위 내용은 c# LazyQueue8742468051c85b06f0a0af9e3e506b5c로 구현한 내용입니다. .php.cn)!


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.