ConcurrentLimitedQueue.cs 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System.Collections.Concurrent;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. namespace Masuit.Tools.Systems;
  5. /// <summary>
  6. /// 定长队列
  7. /// </summary>
  8. /// <typeparam name="T"></typeparam>
  9. public class ConcurrentLimitedQueue<T> : ConcurrentQueue<T>
  10. {
  11. /// <summary>
  12. /// 长度
  13. /// </summary>
  14. public int Limit { get; set; }
  15. /// <summary>
  16. /// 定长队列
  17. /// </summary>
  18. /// <param name="limit"></param>
  19. public ConcurrentLimitedQueue(int limit)
  20. {
  21. Limit = limit;
  22. }
  23. /// <summary>
  24. /// 定长队列
  25. /// </summary>
  26. /// <param name="list"></param>
  27. public ConcurrentLimitedQueue(IEnumerable<T> list) : base(list)
  28. {
  29. Limit = list.Count();
  30. }
  31. /// <summary>
  32. ///
  33. /// </summary>
  34. /// <param name="list"></param>
  35. /// <returns></returns>
  36. public static implicit operator ConcurrentLimitedQueue<T>(List<T> list)
  37. {
  38. return new ConcurrentLimitedQueue<T>(list);
  39. }
  40. /// <summary>
  41. /// 入队
  42. /// </summary>
  43. /// <param name="item"></param>
  44. public new void Enqueue(T item)
  45. {
  46. while (Count >= Limit)
  47. {
  48. TryDequeue(out _);
  49. }
  50. base.Enqueue(item);
  51. }
  52. }