¿Por qué Parallel.Foreach crea hilos sin fin?

El código siguiente continúa creando subprocesos, incluso cuando la cola está vacía ... hasta que finalmente se produce una excepción OutOfMemory. Si sustituyo el Parallel.ForEach con un foreach regular, esto no sucede. ¿Alguien sabe de las razones por las que esto puede suceder?

public delegate void DataChangedDelegate(DataItem obj);

public class Consumer
{
    public DataChangedDelegate OnCustomerChanged;
    public DataChangedDelegate OnOrdersChanged;

    private CancellationTokenSource cts;
    private CancellationToken ct;
    private BlockingCollection<DataItem> queue;

    public Consumer(BlockingCollection<DataItem> queue) {
        this.queue = queue;
        Start();
    }

    private void Start() {
        cts = new CancellationTokenSource();
        ct = cts.Token;
        Task.Factory.StartNew(() => DoWork(), ct);
    }

    private void DoWork() {

        Parallel.ForEach(queue.GetConsumingPartitioner(), item => {
            if (item.DataType == DataTypes.Customer) {
                OnCustomerChanged(item);
            } else if(item.DataType == DataTypes.Order) {
                OnOrdersChanged(item);
            }
        });
    }
}

Respuestas a la pregunta(3)

Su respuesta a la pregunta