I am trying out the RabbitMQ `AsyncEventingBasicConsumer` using the following code:

```
static void Main(string[] args)
{
    Console.Title = "Consumer";

    var factory = new ConnectionFactory() { DispatchConsumersAsync = true };
    const string queueName = "myqueue";

    using (var connection = factory.CreateConnection())
    using (var channel = connection.CreateModel())
    {
        channel.QueueDeclare(queueName, true, false, false, null);

        // consumer

        var consumer = new AsyncEventingBasicConsumer(channel);
        consumer.Received += Consumer_Received;
        channel.BasicConsume(queueName, true, consumer);

        // publisher

        var props = channel.CreateBasicProperties();
        int i = 0;

        while (true)
        {
            var messageBody = Encoding.UTF8.GetBytes($"Message {++i}");
            channel.BasicPublish("", queueName, props, messageBody);
            Thread.Sleep(50);
        }
    }
}

private static async Task Consumer_Received(object sender, BasicDeliverEventArgs @event)
{
    var message = Encoding.UTF8.GetString(@event.Body);

    Console.WriteLine($"Begin processing {message}");

    await Task.Delay(250);

    Console.WriteLine($"End processing {message}");
}

```

It works as expected. If I don't set the `DispatchConsumersAsync` property, however, the messages get consumed but the event handler never fires.

I find it hard to believe that this dangerous behaviour (losing messages because a developer forgot to set a property) is by design.

Questions:

1. What does `DispatchConsumersAsync` actually do?
2. What is happening under the hood in the case without `DispatchConsumersAsync`, where consumption is taking place but the event handler does not fire?
3. Is this behaviour by design?