public static async Task<EventHubMonitor> CreateAsync(
            Configuration configuration,
            TimeSpan pauseBetweenParitions,
            TimeSpan pauseAfterAllPartitions
            )
        {
            var nsm = CreateNamespaceManager(configuration, pauseBetweenParitions);

            // We create a partially applied function so that 
            // we'll only need to pass the partition id later.
            Func<string, Task<PartitionDescription>> getEventHubPartitionAsync =
                partitionId => nsm.GetEventHubPartitionAsync(configuration.EventHubName, configuration.ConsumerGroupName, partitionId);

            var eventhub = await nsm.GetEventHubAsync(configuration.EventHubName).ConfigureAwait(false);

            // Construct a reference to the blob container.
            var storageAccount = CloudStorageAccount.Parse(configuration.CheckpointStorageAccount);
            var blobClient = storageAccount.CreateCloudBlobClient();
            var checkpointContainer = blobClient.GetContainerReference(configuration.EventHubName);

            // The `PartitionCheckpointManager` manages the complexity 
            // of getting the latest checkpoint for each parition.
            var checkpoints = new PartitionCheckpointManager(
                configuration.ConsumerGroupName,
                eventhub.PartitionIds,
                checkpointContainer
                );

            return new EventHubMonitor(
                eventhub.PartitionIds,
                checkpoints.GetLastCheckpointAsync,
                getEventHubPartitionAsync,
                pauseBetweenParitions,
                pauseAfterAllPartitions);
        }
        private static NamespaceManager CreateNamespaceManager(Configuration configuration, TimeSpan timeout)
        {
            var endpoint = ServiceBusEnvironment.CreateServiceUri("sb", configuration.EventHubNamespace, string.Empty);
            var connectionString = ServiceBusConnectionStringBuilder.CreateUsingSharedAccessKey(endpoint,
                configuration.EventHubSasKeyName,
                configuration.EventHubSasKey);

            var nsm = NamespaceManager.CreateFromConnectionString(connectionString);
            nsm.Settings.OperationTimeout = timeout;
            return nsm;
        }
 public static Task<EventHubMonitor> CreateAsync(Configuration configuration)
 {
     return CreateAsync(configuration,
         TimeSpan.FromSeconds(2),
         TimeSpan.FromSeconds(30));
 }