Существует 2 способа отображения времени
Моя идея / формула более вероятна:
Обработано - обновлено с текущий поток от 0 до Total
У меня есть таймер с интервалом 1000 мс, который вычисляет обрабатываемые в секунду:
processedPerSecond = Processed - lastTickProcessed;
lastTickProcessed = Processed; //store state from past call
обработаноPerSecond и lastTickProcessed - глобальные переменные из метода таймера
Теперь, если мы хотим получить сколько секунд потребуется для завершения обработки (в идеальном постоянном предположении) totalSecondsNeeded = TotalLines / PerSecond
, но мы хотим показать случай 2. TimeLeft так TimeLeftSeconds = (TotalLines - Обработано) / 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
. Надеюсь, мои «нервные» мысли помогут кому-то построить что-то удовлетворяющее