Monitor.Wait, Condition variable

Учитывая следующий фрагмент кода (найденный где-то во время обучения многопоточности).

 public class BlockingQueue<T>
    {
        private readonly object sync = new object();
        private readonly Queue<T> queue;
        public BlockingQueue()
        {
            queue = new Queue<T>();
        }

        public void Enqueue(T item)
        {
            lock (sync)
            {
                queue.Enqueue(item);
                Monitor.PulseAll(sync);
            }

        }
        public T Dequeue()
        {
            lock (sync)
            {
                while (queue.Count == 0)
                    Monitor.Wait(sync);

                return queue.Dequeue();
            }

        }
    }

Я хочу понять,

Почему существует цикл while?

   while (queue.Count == 0)
            Monitor.Wait(sync);

и что не так с the,

 if(queue.Count == 0)
       Monitor.Wait(sync);

На самом деле, все время, когда я вижу похожий код, который я нашел с помощью цикла while, может кто-нибудь помочь мне понять использование одного над другим. Спасибо.

11
задан Default 13 June 2011 в 06:38
поделиться