Я сделал это, и он работает довольно хорошо, не стесняйтесь изменять сигнатуру метода в соответствии с вашими типами переменных или также и типом возвращаемого значения, возможно, вы хотели бы получить объект TimeSpan или просто секунды ...
/// <summary>
/// Calculates the eta.
/// </summary>
/// <param name="processStarted">When the process started</param>
/// <param name="totalElements">How many items are being processed</param>
/// <param name="processedElements">How many items are done</param>
/// <returns>A string representing the time left</returns>
private string CalculateEta(DateTime processStarted, int totalElements, int processedElements)
{
int itemsPerSecond = processedElements / (int)(processStarted - DateTime.Now).TotalSeconds;
int secondsRemaining = (totalElements - processedElements) / itemsPerSecond;
return new TimeSpan(0, 0, secondsRemaining).ToString();
}
Вам потребуется инициализировать переменную DateTime
при запуске обработки и отправлять ее методу на каждой итерации.
Не забывайте, что, вероятно, ваше окно будет заблокировано, если процесс будет достаточно длинным, поэтому, когда вы помещаете возвращаемое значение в элемент управления, не забудьте использовать его метод .Refresh()
.
Если вы используете потоки, вы можете попытаться установить текст с помощью метода Invoke(Action)
, было бы проще использовать этот метод расширения для простого архивирования .
Если вы используете консольное приложение, у вас не должно возникнуть проблем с отображением вывода построчно.
Надеюсь, это кому-нибудь поможет.