90 lines
1.2 KiB
C#
90 lines
1.2 KiB
C#
|
using System.Collections.Generic;
|
||
|
using System.Linq;
|
||
|
|
||
|
namespace Aitex.Core.Util
|
||
|
{
|
||
|
public class FixSizeQueue<T>
|
||
|
{
|
||
|
private Queue<T> _innerQueue;
|
||
|
|
||
|
private object _locker = new object();
|
||
|
|
||
|
public int FixedSize { get; set; }
|
||
|
|
||
|
public int Count
|
||
|
{
|
||
|
get
|
||
|
{
|
||
|
lock (_locker)
|
||
|
{
|
||
|
return _innerQueue.Count;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public FixSizeQueue(int size)
|
||
|
{
|
||
|
FixedSize = size;
|
||
|
_innerQueue = new Queue<T>();
|
||
|
}
|
||
|
|
||
|
public void Enqueue(T obj)
|
||
|
{
|
||
|
lock (_locker)
|
||
|
{
|
||
|
_innerQueue.Enqueue(obj);
|
||
|
while (_innerQueue.Count > FixedSize)
|
||
|
{
|
||
|
_innerQueue.Dequeue();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool TryDequeue(out T obj)
|
||
|
{
|
||
|
lock (_locker)
|
||
|
{
|
||
|
obj = default(T);
|
||
|
if (_innerQueue.Count > 0)
|
||
|
{
|
||
|
obj = _innerQueue.Dequeue();
|
||
|
return true;
|
||
|
}
|
||
|
return false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public List<T> ToList()
|
||
|
{
|
||
|
lock (_locker)
|
||
|
{
|
||
|
return _innerQueue.ToList();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void Clear()
|
||
|
{
|
||
|
lock (_locker)
|
||
|
{
|
||
|
_innerQueue.Clear();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public T ElementAt(int index)
|
||
|
{
|
||
|
lock (_locker)
|
||
|
{
|
||
|
return _innerQueue.ElementAt(index);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public bool IsEmpty()
|
||
|
{
|
||
|
lock (_locker)
|
||
|
{
|
||
|
return _innerQueue.Count == 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|