Я использовал этот код как очередь, которая блокируется на Dequeue()
, пока элемент не будет поставлен в очередь.Я использовал этот код в течение нескольких лет в нескольких проектах, все без проблем ... до сих пор.Я вижу тупик в каком-то коде, который пишу сейчас, и при исследовании проблемы мой «глаз подозрения» остановился на этом BlockingQueue<T>
.Я не могу доказать это, поэтому я решил попросить некоторых людей умнее меня проверить это на предмет возможных проблем.Ребята, видите ли вы что-нибудь, что может вызвать тупик в этом коде?
public class BlockingQueue<T>
{
private readonly Queue<T> _queue;
private readonly ManualResetEvent _event;
/// <summary>
/// Constructor
/// </summary>
public BlockingQueue()
{
_queue = new Queue<T>();
_event = new ManualResetEvent(false);
}
/// <summary>
/// Read-only property to get the size of the queue
/// </summary>
public int Size
{
get
{
int count;
lock (_queue)
{
count = _queue.Count;
}
return count;
}
}
/// <summary>
/// Enqueues element on the queue
/// </summary>
/// <param name="element">Element to enqueue</param>
public void Enqueue(T element)
{
lock (_queue)
{
_queue.Enqueue(element);
_event.Set();
}
}
/// <summary>
/// Dequeues an element from the queue
/// </summary>
/// <returns>Dequeued element</returns>
public T Dequeue()
{
T element;
while (true)
{
if (Size == 0)
{
_event.Reset();
_event.WaitOne();
}
lock (_queue)
{
if (_queue.Count == 0) continue;
element = _queue.Dequeue();
break;
}
}
return element;
}
/// <summary>
/// Clears the queue
/// </summary>
public void Clear()
{
lock (_queue)
{
_queue.Clear();
}
}
}