¿Monitor.Wait necesita sincronización?

He desarrollado una cola genérica productor-consumidor que pulsa por Monitor de la siguiente manera:

la cola:

    public void EnqueueTask(T task)
    {
        _workerQueue.Enqueue(task);
        Monitor.Pulse(_locker);
    }

la cola:

private T Dequeue()
    {
        T dequeueItem;
        if (_workerQueue.Count > 0)
        {
               _workerQueue.TryDequeue(out dequeueItem);
            if(dequeueItem!=null)
                return dequeueItem;
        }
        while (_workerQueue.Count == 0)
            {
                Monitor.Wait(_locker);
        }
         _workerQueue.TryDequeue(out dequeueItem);
        return dequeueItem;
    }

la sección de espera produce la siguiente excepción SynchronizationLockException: "se llamó al método de sincronización de objetos desde un bloque de código no sincronizado" ¿necesito sincronizarlo? por qué ? ¿Es mejor usar ManualResetEvents o la versión Slim de .NET 4.0?

Respuestas a la pregunta(3)

Su respuesta a la pregunta