ホームページ  >  記事  >  バックエンド開発  >  C# LazyQueue 実装

C# LazyQueue 実装

黄舟
黄舟オリジナル
2017-03-02 13:14:411602ブラウズ

タスクが多い場合、キューを作成する必要がある場合があります。キューの数が一定の数に達するとデキューされて処理されますが、その数に長時間到達しない場合はどうなるでしょうか。次に、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 中国語 Web サイト (www.php.cn) を参照してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。