AppHarbor.ConsoleProgressBar.Render C# (CSharp) Method

Render() private static method

private static Render ( double percentage, string message ) : void
percentage double
message string
return void
        private static void Render(double percentage, string message)
        {
            Console.CursorLeft = 0;

            using (new ForegroundColor(ConsoleColor.Cyan))
            {
                try
                {
                    Console.CursorVisible = false;

                    int width = Console.WindowWidth - 1;
                    int newWidth = (int)((width * percentage) / 100d);
                    string progressBar = string.Empty
                        .PadRight(newWidth, ProgressBarCharacter)
                        .PadRight(width - newWidth, ' ');

                    Console.Write(progressBar);
                    message = message ?? string.Empty;

                    Console.WriteLine();

                    OverwriteConsoleMessage(message);
                    Console.CursorTop--;
                }
                finally
                {
                    Console.CursorVisible = true;
                }
            }
        }

Usage Example

        public void Update(string message, long processedItems, long totalItems)
        {
            var secondsSinceLastAverage = (DateTime.Now - _lastProgressEvent.Key).TotalSeconds;

            if (secondsSinceLastAverage > 2)
            {
                if (_lastProgressEvent.Key != DateTime.MinValue)
                {
                    var itemsSinceLastProgress = processedItems - _lastProgressEvent.Value;

                    var itemsPerSecond = itemsSinceLastProgress / secondsSinceLastAverage;
                    _perSecondAverages.Add(itemsPerSecond);
                    if (_perSecondAverages.Count() > 20)
                    {
                        _perSecondAverages.RemoveAt(0);
                    }
                }
                _lastProgressEvent = new KeyValuePair <DateTime, double>(DateTime.Now, processedItems);
            }

            var itemsRemaining = totalItems - processedItems;
            var timeEstimate   = _perSecondAverages.Count() < 1 ? "Estimating time left" :
                                 string.Format("{0} left", TimeSpan
                                               .FromSeconds(itemsRemaining / WeightedAverage(_perSecondAverages))
                                               .GetHumanized());

            var percentDone = (processedItems * 100) / totalItems;

            lock (_lock)
            {
                ConsoleProgressBar.Render(percentDone, string.Format("{0} ({1}% of {2:0.0} {3}). {4}",
                                                                     message, percentDone, _displayUnitConversion(totalItems), _displayUnit, timeEstimate));
            }
        }