Barres de progression en direct - Spectre Console Series
La bibliothèque Spectre.Console a pour but de transformer des applications de console C# ordinaires en outils visuellement attrayants et informatifs. L'une de ses caractéristiques les plus frappantes est la possibilité d'afficher des barres de progression qui se mettent à jour au fur et à mesure que votre application fonctionne. Cela est extrêmement utile pour les tâches de longue haleine pour lesquelles vous souhaitez tenir l'utilisateur informé.
Dans sa vidéo "Live Progress Bars - Spectre Console Series", Tim Corey montre comment créer une barre de progression C# Spectre Console étape par étape.
Configuration de l'application console
Au début de la vidéo (0:00), Tim présente la bibliothèque de console Spectre.Console et indique que le lien vers le code source est disponible sous la vidéo. Il rappelle aux téléspectateurs qu'il s'agit de séquences de 10 minutes que vous pouvez intégrer dans votre journée.
Tim travaille dans une application console C# normale - pensez à un simple fichier boilerplate avec la classe Program et static void Main(string[\N]args). Il n'utilise pas de cadre d'interface utilisateur particulier, mais simplement une référence de paquet NuGet à Spectre.Console. Il s'agit d'un bon rappel que vous pouvez intégrer ces fonctionnalités dans n'importe quel terminal Windows ou hôte de console.
Création du contexte de progression
À 0:34, Tim commence à coder. Dans sa méthode Main, il appelle AnsiConsole.Progress() puis .Start(). Il s'agit du point d'entrée standard d'une barre de progression dans Spectre.Console.
Il montre que vous passez une lambda avec un paramètre de contexte, que vous pouvez considérer comme un ctx asynchrone lorsque vous le rendez asynchrone par la suite. Dans ce contexte, vous définissez vos tâches. C'est l'équivalent pour Spectre.Console de la mise en place de vos tâches de progression avant de commencer à les mettre à jour.
Ajouter des tâches de progression
Tim crée trois tâches de progression :
-
"Télécharger des données
-
"Installer une application
- "Nettoyage de données
Chaque tâche est ajoutée avec var task = context.AddTask("..."). Ces poignées de tâches vous seront retournées et vous pourrez les incrémenter par la suite. Tim note (1:22) qu'il ne fait qu'effleurer la surface - Spectre.Console prend en charge différents styles, colonnes et dispositions, comme l'ajout d'une nouvelle colonne ProgressBarColumn, d'une nouvelle colonne PercentageColumn, d'une nouvelle colonne SpinnerColumn ou d'une nouvelle colonne TaskDescriptionColumn pour personnaliser l'apparence de votre barre.
Il compare les tâches à l'installateur de Visual Studio : téléchargement, installation, puis nettoyage (1:42). Vous pouvez imaginer que chaque tâche contient un pourcentage ou une valeur int en interne lorsque vous la mettez à jour.
Mise à jour des barres de progression
À 1:50, Tim met en place une boucle while qui s'exécute jusqu'à ce que le contexte soit terminé. Dans un véritable programme de console C#, vous pourriez écrire while (!context.IsFinished) ou while (context.IsFinished == false) à l'intérieur de votre méthode Main.
À l'intérieur de la boucle, il appelle Thread.Sleep(500) pour ralentir les choses (2:15). Il appelle ensuite task.Increment() avec un double aléatoire multiplié par une valeur maximale (2:29, 2:47). Il s'agit de simuler un travail en cours.
Il met à jour les tâches 1 et 2 à des vitesses différentes et, pour la tâche 3, il ajoute une vérification if (3:05) afin qu'elle ne démarre que si le pourcentage de la tâche 2 est supérieur à 80. Il s'agit essentiellement de contrôler les dépendances entre les tâches de progression.
Bien que Tim ne tape pas littéralement int i dans une boucle foreach, vous pouvez imaginer l'utiliser pour itérer sur des tâches et appeler .Increment(int) pour chacune d'entre elles. En production, vous pouvez avoir des données réelles, telles qu'un client var qui télécharge des fichiers, ou un nom de fichier en chaîne qui est traité. Tim se contente de chiffres aléatoires pour montrer l'affichage.
Afficher et observer les barres de progression
À 3:47, Tim exécute l'application console. Les barres de progression apparaissent empilées. Chaque barre indique un pourcentage à la fin et devient verte lorsqu'elle est terminée (4:01). Une fois les premières tâches accomplies, le "nettoyage des données" commence.
À 4:14, Tim fait remarquer que le curseur revient au bas de la console, un détail mineur mais important pour l'utilisateur. La barre de progression de Spectre.Console formate automatiquement l'état et maintient le tout en place sans clignoter.
Passer à l'asynchronisme avec Await Task
À 4:36, Tim passe à la vitesse supérieure pour montrer une version asynchrone. Il remplace .Start() par .StartAsync() et marque le lambda async. Le paramètre contextuel se comporte désormais comme le paramètre async ctx.
À l'intérieur, au lieu de Thread.Sleep, il utilise await Task.Delay(500) (4:58). Cela permet de reprendre le contrôle du système pendant l'attente. Dans un programme réel, vous pouvez attendre une opération réelle, telle que await client.DownloadAsync() ou await AnsiConsole.MarkupAsync() pour imprimer un texte d'état à côté de la barre.
La version asynchrone fonctionne exactement de la même manière sur le plan visuel (5:16-5:23), mais elle est mieux adaptée aux flux de travail asynchrones modernes. Tim ne le montre pas, mais vous pouvez également capturer des exceptions avec try/catch (Exception ex) autour de vos tâches attendues.

AutoClear et finitions
Tim remarque que, par défaut, Spectre.Console laisse les tâches terminées à l'écran à 100 %. Si vous souhaitez qu'ils disparaissent automatiquement, appelez .AutoClear(true) après avoir configuré votre progression (5:42). Une fois le travail terminé, les barres disparaissent instantanément (6:02).

Cette traduction est utile lorsque vous ne devez afficher qu'un rapport d'avancement temporaire et que vous ne voulez pas encombrer la sortie de la console. Combinée à des invites interactives, à de nouveaux panneaux d'affichage ou même à un tableau var de Spectre.Console, vous pouvez créer une interface utilisateur de console dynamique de type tableau de bord.
Au-delà des bases - Différents styles et colonnes
Dans les dernières minutes, Tim mentionne (6:11) qu'il y a beaucoup plus à explorer. Vous pouvez modifier le format, les couleurs, les mises en page et utiliser différents types de colonnes. Par exemple, vous pouvez ajouter un nouveau diagramme à barres, un nouveau tableau ou combiner un nouveau panneau avec des barres de progression pour afficher des résultats groupés.
La documentation de Spectre.Console montre comment intégrer de nouvelles implémentations de ProgressColumn, ou ajuster la valeur maximale de chaque tâche, ou même replier plusieurs tâches dans une seule barre pour économiser de l'espace ("folding space"). Vous pourriez les utiliser pour afficher des comptes, des nombres totaux, des noms de fichiers, des noms d'utilisateurs ou des mots de passe en cours de traitement, le tout dans un format agréable au sein de votre application console.
Conclusion
Tim, à la fin de sa vidéo a couvert :
-
Une barre de progression de la console Spectre créée de toutes pièces
-
Comment définir et mettre à jour plusieurs tâches de progression
-
Comment l'exécuter de manière synchrone avec Thread.Sleep ou de manière asynchrone avec await Task.Delay ?
-
Comment utiliser .AutoClear(true) pour effacer les barres finies
- Où s'adresser pour un style et une documentation plus avancés ?
Cette petite démo montre à quel point il est facile d'intégrer des barres de progression d'aspect professionnel dans n'importe quel programme de console C#. En utilisant simplement le package NuGet de Spectre.Console et quelques lignes de code, vous pouvez afficher l'état, les pourcentages et donner à vos utilisateurs une vision beaucoup plus claire de ce que fait votre application.
