static async Task ReceiveMessages(string connectionString, int numPartitions, int numClients, bool verbose) { Console.WriteLine($"Receiving messages from {numPartitions} partitions using {numClients} client instances"); var clients = new EventHubClient[numClients]; for (var i = 0; i < numClients; i++) { clients[i] = new EventHubClient(connectionString, _eventHubName); } try { var client = clients.First(); var partitionIds = (await client.GetPartitionIdsAsync()).Take(numPartitions); var partitions = await Task.WhenAll(partitionIds.Select(id => client.GetPartitionPropertiesAsync(id))); var totalCount = (long)0; foreach (var partition in partitions) { var begin = partition.BeginningSequenceNumber; var end = partition.LastEnqueuedSequenceNumber; var count = end - begin + 1; totalCount += count; if (verbose) { Console.WriteLine($"Partition: {partition.Id}, Begin: {begin}, End: {end}, Count: {count}"); } } if (verbose) { Console.WriteLine($"Total Count: {totalCount}"); } var consumers = new EventHubConsumer[numPartitions]; for (var i = 0; i < numPartitions; i++) { consumers[i] = clients[i % numClients].CreateConsumer(EventHubConsumer.DefaultConsumerGroupName, partitions[i].Id, EventPosition.Earliest); } try { var receiveTasks = new Task <(int messagesReceived, long lastSequenceNumber)> [numPartitions]; var sw = Stopwatch.StartNew(); for (var i = 0; i < numPartitions; i++) { receiveTasks[i] = ReceiveAllMessages(consumers[i], partitions[i]); } var results = await Task.WhenAll(receiveTasks); sw.Stop(); var elapsed = sw.Elapsed.TotalSeconds; var messagesReceived = results.Select(r => r.messagesReceived).Sum(); var messagesPerSecond = messagesReceived / elapsed; var megabytesPerSecond = (messagesPerSecond * _bytesPerMessage) / (1024 * 1024); Console.WriteLine($"Received {messagesReceived} messages of size {_bytesPerMessage} in {elapsed:N2}s " + $"({messagesPerSecond:N2} msg/s, {megabytesPerSecond:N2} MB/s)"); }