BlockingQueue.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Threading;
  4. using System.Text;
  5. namespace Utilities
  6. {
  7. public class BlockingQueue<T>
  8. {
  9. private Queue<T> m_queue = new Queue<T>();
  10. private int m_count = 0;
  11. private bool m_stopping;
  12. public void Enqueue(T item)
  13. {
  14. lock (m_queue)
  15. {
  16. m_queue.Enqueue(item);
  17. m_count++;
  18. if (m_queue.Count == 1)
  19. {
  20. Monitor.Pulse(m_queue);
  21. }
  22. }
  23. }
  24. public void Enqueue(List<T> items)
  25. {
  26. if (items.Count == 0)
  27. {
  28. return;
  29. }
  30. lock (m_queue)
  31. {
  32. foreach (T item in items)
  33. {
  34. m_queue.Enqueue(item);
  35. m_count++;
  36. }
  37. if (m_queue.Count == items.Count)
  38. {
  39. Monitor.Pulse(m_queue);
  40. }
  41. }
  42. }
  43. /// <returns>Will return false if the BlockingQueue is stopped</returns>
  44. public bool TryDequeue(out T item)
  45. {
  46. lock (m_queue)
  47. {
  48. while (m_queue.Count == 0)
  49. {
  50. Monitor.Wait(m_queue);
  51. if (m_stopping)
  52. {
  53. item = default(T);
  54. return false;
  55. }
  56. }
  57. item = m_queue.Dequeue();
  58. m_count--;
  59. return true;
  60. }
  61. }
  62. public void Stop()
  63. {
  64. lock (m_queue)
  65. {
  66. m_stopping = true;
  67. Monitor.PulseAll(m_queue);
  68. }
  69. }
  70. public int Count
  71. {
  72. get
  73. {
  74. return m_count;
  75. }
  76. }
  77. }
  78. }