In the RabbitMQ .NET client,
I think (I might be wrong!) it's done because of performance reasons.
SharedQueue<T> which is basically .NET
Queue with locks. In order to handle a delivery, you need to lock on queue, enqueue an item and notify other threads waiting for the queue (Monitor.Pulse).
EventingBasicConsumer doesn't use any queueing mechanism. It simply fires Received (HandleBasicDeliver) event which you need to handle in your code.
As you can see now
EventingBasicConsumer has less performance overhead, so it's faster (it should be).