Does refactoring a while loop increase CPU usage?
Well, after more resarch and testing, it appears that the GetConsumingEnumerable() method of the BlockingCollection&lt;T&gt; is actually blocking when there are no items to consume. And it handles the case where the collection is completed as well.

The final touch, it that, instead of using a ManualResetEvent to signal the consumer to stop, like the original code, I'm using a CancellationToken instead.

This allows me to simplify the code drastically.

Here is the final snippet:

    protected override void Run(string[] args)
    {
        try
        {
            foreach (var item in queue_.GetConsumingEnumerable(cancellation_.Token))
            {
                tasks_.Add(CreateWorkItemHandler(item));
                if (tasks_.Count == MaxConcurrentHandlers)
                    WaitAndDiscardAnyCompletedTask();
            }
        }
        catch (OperationCanceledException /* e */)
        {
        }

        while (tasks_.Count &gt; 0)
            WaitAndDiscardAnyCompletedTask();
    }


PS: I should have done more testing before posting. But, I'm leaving the question and its answer here for reference.