Mega Code Archive

 
Categories / C# / Collections Data Structure
 

Syncronized Queue

using System.Collections.Generic; using System.Threading; namespace Td.Additional.Collections {     /// <summary>     /// Syncronized queue.     /// See also: http://www.mycsharp.de/wbb2/thread.php?threadid=80713.     /// </summary>     /// <typeparam name="T">Type of queued items.</typeparam>     public class SyncQueue<T>     {         #region Private fields         private Queue<T> _q = new Queue<T>();         #endregion         #region Queue methods         /// <summary>         /// Enqueues the specified item.         /// </summary>         /// <param name="tItem">The item.</param>         public void Enqueue(T tItem)         {             lock (this)             {                 _q.Enqueue(tItem);                 Monitor.Pulse(this);                 System.Diagnostics.Debug.WriteLine(Thread.CurrentThread.Name + " Enqueue ==> " + _q.Count);             }         }         /// <summary>         /// Dequeues the next item. If no item in queue, method waits, until an item is in the queue.         /// </summary>         /// <returns></returns>         public T Dequeue()         {             Monitor.Enter(this);             try             {                 while (_q.Count == 0)                 {                     System.Diagnostics.Debug.WriteLine(Thread.CurrentThread.Name + " Wait");                     Monitor.Wait(this);                 }                 System.Diagnostics.Debug.WriteLine(Thread.CurrentThread.Name + " Dequeue ==> " + (_q.Count - 1));                 return _q.Dequeue();             }             finally             {                 Monitor.Exit(this);             }         }         #endregion     } }