Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class CircularBuffer<T>
- {
- private readonly ConcurrentQueue<T> data;
- private readonly ReaderWriterLockSlim lockQueue = new ReaderWriterLockSlim();
- private readonly int size;
- public CircularBuffer(int size)
- {
- if (size < 1)
- {
- throw new ArgumentException($"{nameof(size)} cannot be negative or zero");
- }
- data = new ConcurrentQueue<T>();
- this.size = size;
- }
- public IEnumerable<T> Latest()
- {
- return data.ToArray();
- }
- public T Take()
- {
- T value;
- data.TryDequeue(out value);
- return value;
- }
- public void Put(T t)
- {
- lockQueue.EnterWriteLock();
- try
- {
- if (data.Count == size)
- {
- T value;
- data.TryDequeue(out value);
- }
- data.Enqueue(t);
- }
- finally
- {
- lockQueue.ExitWriteLock();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement