public async Task <bool> Start(ConfigurationOptions config, CancellationToken cancellationToken)
        {
            CloudStorageAccount storageAccount;

            try
            {
                storageAccount = CloudStorageAccount.Parse(config.ConnectionString);
            }
            catch (FormatException ex)
            {
                _console.ColoredWriteLine($"<r>Error parsing the connection string: <w>{ex.Message}</w></r>");
                return(false);
            }

            Console.Clear();
            Console.Title         = $"Azure Storage Queue Monitor{(!string.IsNullOrWhiteSpace(config.Title) ? $" -- {config.Title}" : "")}";
            Console.CursorVisible = false;

            Dictionary <string, QueueInfo> queueInfos = new Dictionary <string, QueueInfo>();

            CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
            int       iterations         = 0;
            Stopwatch sw = new Stopwatch();

            while (true)
            {
                await Task.Yield();

                if (cancellationToken.IsCancellationRequested)
                {
                    return(true);
                }

                sw.Restart();
                iterations++;
                if (iterations == 50)
                {
                    iterations = 0;
                    queueInfos.Clear();
                }
                List <CloudQueue> queues = queueClient.ListQueues().ToList();
                foreach (var queue in queues)
                {
                    try
                    {
                        queue.FetchAttributes();
                    }
                    catch (StorageException sex) when(sex.Message.Contains("The specified queue does not exist"))
                    {
                        if (queueInfos.ContainsKey(queue.Name))
                        {
                            queueInfos.Remove(queue.Name);
                        }
                    }

                    string name = queue.Name;
                    if (config.IgnoredQueues?.Any(i => Regex.IsMatch(name, i)) ?? false)
                    {
                        continue;
                    }

                    int count = queue.ApproximateMessageCount ?? 0;
                    if (!queueInfos.ContainsKey(name))
                    {
                        bool isImportant = false;
                        if (config.ImportantQueues?.Any(i => Regex.IsMatch(name, i)) ?? false)
                        {
                            isImportant = true;
                        }

                        string groupName  = "NOT GROUPED";
                        int    groupOrder = int.MaxValue;
                        if (config.GroupQueues)
                        {
                            foreach (var queueGroup in config.QueueGroups)
                            {
                                if (queueGroup.Queues.Any(q => Regex.IsMatch(name, q)))
                                {
                                    groupName  = queueGroup.GroupName;
                                    groupOrder = queueGroup.Order;
                                    continue;
                                }
                            }
                        }

                        queueInfos.Add(name, new QueueInfo {
                            Name         = name,
                            FirstCount   = count,
                            CurrentCount = count,
                            IsImportant  = isImportant,
                            GroupName    = groupName,
                            GroupOrder   = groupOrder
                        });
                    }
                    else
                    {
                        var info = queueInfos[name];
                        if (count > info.FirstCount)
                        {
                            info.FirstCount     = count;
                            info.IncreasedCount = true;
                        }
                        else
                        {
                            info.IncreasedCount = false;
                        }
                        info.DecreasedCount = count < info.CurrentCount;
                        info.CurrentCount   = count;
                    }
                }
                PrintQueues(config, queueInfos, iterations);
                if (config.ExportCountData)
                {
                    if (_previousQueueCount != queueInfos.Count)
                    {
                        _exportFullPath = null;
                    }
                    ExportCountData(config, queueInfos);
                }
                _previousQueueCount = queueInfos.Count;
                sw.Stop();
                long sleepInterval = config.Interval - sw.ElapsedMilliseconds;
                if (sleepInterval > 0)
                {
                    await Task.Delay(config.Interval, cancellationToken);
                }
            }
        }
        private void PrintQueues(ConfigurationOptions config, Dictionary <string, QueueInfo> queueInfos, int iterations)
        {
            Console.CursorVisible = false;
            if (iterations == 0)
            {
                Console.Clear();
            }

            Console.SetCursorPosition(0, 0);
            _console.ColoredWriteLine(BLACK_WHITE, "Queue", "Messages", "Msgs/s", "Remaining Time", "Est. Conclusion");
            _console.ColoredWriteLine(BLACK_WHITE, new string('=', 5), new string('=', 8), new string('=', 6), new string('=', 14), new string('=', 15));

            string colorPattern = "";

            var filteredQueueInfos = !config.ShowEmptyQueues ? queueInfos.Where(q => q.Value.FirstCount != 0 || q.Value.CurrentCount != 0)
                                                             : queueInfos;

            IOrderedEnumerable <KeyValuePair <string, QueueInfo> > orderedQueueInfos;

            if (config.GroupQueues)
            {
                orderedQueueInfos = filteredQueueInfos.OrderBy(q => q.Value.GroupOrder)
                                    .ThenBy(q => q.Value.GroupName);
                if (config.OrderByQueueSize)
                {
                    orderedQueueInfos = orderedQueueInfos.ThenByDescending(q => q.Value.CurrentCount);
                }
                orderedQueueInfos = orderedQueueInfos.ThenBy(q => q.Key);
            }
            else
            {
                if (config.OrderByQueueSize)
                {
                    orderedQueueInfos = filteredQueueInfos.OrderByDescending(q => q.Value.CurrentCount)
                                        .ThenBy(q => q.Key);
                }
                else
                {
                    orderedQueueInfos = filteredQueueInfos.OrderBy(q => q.Key);
                }
            }


            string previousGroupName = "";
            bool   isFirstGroup      = true;

            foreach (string queue in orderedQueueInfos.Select(q => q.Key))
            {
                if (queueInfos[queue].GroupName != previousGroupName)
                {
                    if (!isFirstGroup)
                    {
                        //"{0,58}  {1,8}  {2,6}  {3,14}  {4,15}"
                        _console.ColoredWriteLine(BLACK_WHITE, new string('\u00A0', 58)
                                                  , new string('\u00A0', 8)
                                                  , new string('\u00A0', 6)
                                                  , new string('\u00A0', 14)
                                                  , new string('\u00A0', 15));
                    }
                    _console.ColoredWriteLine(BLACK_WHITE, queueInfos[queue].GroupName.ToUpper(), "", "", "", "");
                    previousGroupName = queueInfos[queue].GroupName;
                    isFirstGroup      = false;
                }

                if (queueInfos[queue].IsImportant && queueInfos[queue].IncreasedCount)
                {
                    colorPattern = DARKRED_WHITE;
                }
                else if (queueInfos[queue].IsImportant && queueInfos[queue].DecreasedCount)
                {
                    colorPattern = DARKGREEN_WHITE;
                }
                else if (queueInfos[queue].IsImportant)
                {
                    colorPattern = BLACK_RED;
                }
                else if (queueInfos[queue].IncreasedCount)
                {
                    colorPattern = BLACK_BLUE;
                }
                else if (queueInfos[queue].DecreasedCount)
                {
                    colorPattern = BLACK_GREEN;
                }
                else
                {
                    colorPattern = BLACK_GRAY;
                }
                _console.ColoredWriteLine(colorPattern, queueInfos[queue].Name, queueInfos[queue].CurrentCount.ToString(), queueInfos[queue].Speed, queueInfos[queue].RemainingTime, queueInfos[queue].EstimatedConclusion);
            }
            Console.SetCursorPosition(0, 0);
        }