private static async Task InitializeStorageEntities()
        {
            AzureTableProvider azureTableProvider = new AzureTableProvider(Settings.StorageAccountConnectionString);
            CloudTable         tokenTable         = await azureTableProvider.EnsureTableExistAsync(Settings.TokenTableName);

            CloudTable pageJobMappingTable = await azureTableProvider.EnsureTableExistAsync(Settings.PageJobMappingTableName);

            CloudTable settingsTable = await azureTableProvider.EnsureTableExistAsync(Settings.ConfigurationSettingsTableName);

            await GetConfigurationSettingFomStorge(azureTableProvider, settingsTable);
        }
        public async static Task ProcessQueueMessage()
        {
            queueProvider       = new AzureStorageQueueProvider(Settings.StorageAccountConnectionString, Settings.QueueName);
            azureTableProvider  = new AzureTableProvider(Settings.StorageAccountConnectionString);
            pageJobMappingTable = await azureTableProvider.EnsureTableExistAsync(Settings.PageJobMappingTableName);

            while (true)
            {
                try
                {
                    CloudQueueMessage queueMessage = queueProvider.GetMessage(queueVisibilityTimeOutInSec);

                    if (queueMessage != null)
                    {
                        await ProcessMessage(queueMessage, httpClient, pageJobMappingTable);

                        // Delete the message
                        queueProvider.DeleteMessage(queueMessage);
                    }
                    else
                    {
                        await Task.Delay(sleepTime);
                    }
                }
                catch (Exception ex)
                {
                    // If ProcessMessage throws an exception, it will reappear in queue after visibility timeout
                    Trace.TraceError($"Processing Failed in ProcessQueueMessage. Exception: {ex.Message}, {ex.StackTrace}");
                }
            }
        }