ConcurrentLimitedQueue.cs 1.4 KB

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