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));
            }
        }