有时候,当任务比较多的时候,需要做一个队列。当队列数量达到一定数量时候,进行出队并处理,但是如果很长时间都没有达到那个数量呢?那就加一个时间限制,例如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实现的内容。