Syncronized Queue : Queue « Collections Data Structure « C# / C Sharp
- C# / C Sharp
- Collections Data Structure
- Queue
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
}
}
Related examples in the same category