| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 | using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections.Concurrent; namespace Aitex.Core.Util{    public class FixSizeQueue<T>    {        public int FixedSize { get; set; }        public int Count {            get            {                lock (_locker)                {                    return _innerQueue.Count;                }            }         }        private Queue<T> _innerQueue;        private object _locker = new object();        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;            }        }}}
 |