Sic.Framework/MECF.Framework.Common/Aitex/Core/Util/FixSizeQueue.cs

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