J'ai fait ceci et cela fonctionne très bien, n'hésitez pas à changer la signature de la méthode en fonction des types de variables ou aussi du type de retour, probablement vous voudriez obtenir l'objet TimeSpan ou juste les secondes...
/// <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();
}
Vous devrez initialiser un DateTime
lorsque le traitement commence et l'envoie à la méthode à chaque itération.
N'oubliez pas que votre fenêtre sera probablement verrouillée si le processus est assez long, donc lorsque vous placez la valeur de retour dans un contrôle, n'oubliez pas d'utiliser la balise .Refresh()
de la méthode.
Si vous utilisez des threads, vous pouvez tenter de définir le texte à l'aide de la fonction Invoke(Action)
il serait plus facile d'utiliser la méthode cette méthode d'extension pour l'archiver facilement.
Si vous utilisez une application console, vous ne devriez pas avoir de problèmes pour afficher la sortie ligne par ligne.
J'espère que cela aidera quelqu'un.