Есть 2 способа показать время
Прошедшее время и оставшееся время в целом:
истекшее время будет увеличиваться, но оставшееся время, скорее всего, будет стабильным (если стабильно в секунду)
Время истекло и осталось:
так что оставшееся время = всего необходимо - прошло
Моя идея / формула более похожа на это:
Обработано - обновлено из запущенного потока с 0 до Всего
У меня есть таймер с интервалом 1000 мс, который вычисляет количество обработанных в секунду:
processedPerSecond = Processed - lastTickProcessed;
lastTickProcessed = Processed; //store state from past call
processingPerSecond и lastTickProcessed - глобальные переменные вне метода таймера
Теперь, если мы хотим узнать, сколько секунд требуется для завершения обработки (в идеальном постоянном предположении)
totalSecondsNeeded = TotalLines / PerSecond
но мы хотим показать случай 2. TimeLeft так
TimeLeftSeconds = (Всего строк - обработано) / PerSecond
TimeSpan remaining = new TimeSpan(0, 0, (transactions.Count - Processed) / processedPerSecond);
labelTimeRemaining.Text = remaining.ToString(@"hh\:mm\:ss");
Конечно, TimeLeftSeconds будет «прыгать», если PerSecond прыгает, поэтому, если за PerSecond было 10, а затем 30, а затем до 10, пользователь увидит его.
Существует способ вычисления среднего значения, но он может не отображать реального времени, оставшегося в случае ускорения процесса в конце
int perSecond = (int)Math.Ceiling((processed / (decimal)timeElapsed.TotalSeconds)); //average not in past second
Таким образом, разработчик может выбрать «выбрать» метод, который будет наиболее точным на основе прогноза «нестабильной» обработки
Мы также можем рассчитать и сохранить каждую PerSecond, затем взять последние 10 секунд и сделать среднее значение, но в этом случае пользователю придется ждать 10 секунд, чтобы увидеть первый расчет
или мы могли бы показать оставшееся время, начиная с первого в секунду, а затем прогрессивно усредняя, суммируя до 10 в последнюю PerSecond
Надеюсь, мои "нервные" мысли помогут кому-то построить что-нибудь удовлетворяющее