Zum Fußzeileninhalt springen
Iron Academy Logo
C#-Anwendung
C#-Anwendung

Andere Kategorien

Live-Fortschrittsbalken - Spectre Console Series

Tim Corey
7m 04s

Bei der Spectre.Console-Bibliothek geht es darum, gewöhnliche C#-Konsolenanwendungen in visuell ansprechende, informative Tools zu verwandeln. Eines der auffälligsten Merkmale ist die Möglichkeit, Fortschrittsbalken anzuzeigen, die sich während der Arbeit an Ihrer Anwendung aktualisieren. Dies ist äußerst hilfreich für langwierige Aufgaben, bei denen Sie den Benutzer auf dem Laufenden halten wollen.

In seinem Video "Live Progress Bars - Spectre Console Series" zeigt Tim Corey, wie man Schritt für Schritt einen Fortschrittsbalken in C# Spectre Console erstellt.

Einrichten der Konsolenanwendung

Zu Beginn des Videos (0:00) stellt Tim die Konsolenbibliothek Spectre.Console vor und weist darauf hin, dass der Link zum Quellcode unter dem Video verfügbar ist. Er erinnert die Zuschauer daran, dass es sich um 10-Minuten-Brocken handelt, die Sie in Ihren Tag einbauen können.

Tim arbeitet in einer normalen C#-Konsolenanwendung - denken Sie an eine einfache Boilerplate-Datei mit der Klasse Program und static void Main(string[] args). Er verwendet kein spezielles UI-Framework, sondern lediglich einen NuGet-Paketverweis auf Spectre.Console. Dies ist eine gute Erinnerung daran, dass Sie diese Funktionen in jedes Windows-Terminal oder jeden Konsolen-Host bringen können.

Erstellung des Progress-Kontextes

Bei 0:34 beginnt Tim mit der Codierung. In seiner Main-Methode ruft er AnsiConsole.Progress() und anschließend .Start() auf. Dies ist der Standard-Einstiegspunkt für einen Fortschrittsbalken in Spectre.Console.

Er zeigt, dass Sie ein Lambda mit einem Kontextparameter übergeben, den Sie sich als async ctx vorstellen können, wenn Sie es später asynchron machen. In diesem Kontext definieren Sie Ihre Aufgaben. Dies ist das Spectre.Console-Äquivalent zum Einrichten Ihrer Fortschrittsaufgaben, bevor Sie sie aktualisieren.

Fortschrittsaufgaben hinzufügen

Tim erstellt drei Fortschrittsaufgaben:

  • "Daten herunterladen"

  • "Anwendung installieren"

  • "Datenbereinigung"

Jede Aufgabe wird mit var task = context.AddTask("...") hinzugefügt. Diese zurückgegebenen Aufgaben können Sie später erweitern. Tim merkt an (1:22), dass er nur an der Oberfläche kratzt - Spectre.Console unterstützt verschiedene Stile, Spalten und Layouts, z. B. das Hinzufügen einer neuen ProgressBarColumn, einer neuen PercentageColumn, einer neuen SpinnerColumn oder einer neuen TaskDescriptionColumn, um das Aussehen der Leiste anzupassen.

Er vergleicht die Aufgaben mit dem Installationsprogramm von Visual Studio: Herunterladen, Installieren und anschließend Aufräumen (1:42). Sie können sich vorstellen, dass jede Aufgabe intern einen int-Prozent- oder int-Wert enthält, während Sie sie aktualisieren.

Aktualisierung der Fortschrittsbalken

Bei 1:50 richtet Tim eine while-Schleife ein, die so lange läuft, bis der Kontext abgeschlossen ist. In einem echten C-Konsolenprogramm schreiben Sie vielleicht while (!context.IsFinished) oder while (context.IsFinished == false) innerhalb Ihrer Main-Methode.

Innerhalb der Schleife ruft er Thread.Sleep(500) auf, um die Dinge zu verlangsamen (2:15). Dann ruft er task.Increment() mit einem zufälligen Double multipliziert mit einem Max-Wert auf (2:29, 2:47). Dies simuliert die Arbeit, die geleistet wird.

Er aktualisiert Aufgabe eins und Aufgabe zwei mit unterschiedlichen Geschwindigkeiten, und für Aufgabe drei fügt er eine if-Prüfung ein (3:05), so dass sie erst beginnt, wenn der Prozentsatz von Aufgabe zwei größer als 80 ist. Dies ist im Wesentlichen eine Kontrolle der Abhängigkeiten zwischen den Fortschrittsaufgaben.

Obwohl Tim nicht wortwörtlich int i in eine foreach-Schleife eingibt, können Sie sich vorstellen, eine solche zu verwenden, um über Aufgaben zu iterieren und .Increment(int) für jede aufzurufen. In der Produktion haben Sie möglicherweise echte Daten, z. B. einen var-Client, der Dateien herunterlädt, oder einen String-Dateinamen, der verarbeitet wird. Tim hält es einfach mit Zufallszahlen, um das Display zu zeigen.

Anzeigen und Beobachten der Fortschrittsbalken

Bei 3:47 führt Tim die Konsolenanwendung aus. Die Fortschrittsbalken erscheinen gestapelt. Jeder Balken zeigt am Ende einen Prozentsatz an und wird grün, wenn er vollständig ist (4:01). Sobald die ersten Aufgaben erledigt sind, beginnt die "Datenbereinigung".

Bei 4:14 weist Tim darauf hin, dass der Cursor an den unteren Rand der Konsole zurückkehrt, ein kleines, aber wichtiges Usability-Detail. Der Fortschrittsbalken von Spectre.Console formatiert automatisch den Status und hält alles an seinem Platz, ohne zu flackern.

Asynchron mit Await Task arbeiten

Bei 4:36 schaltet Tim einen Gang höher und zeigt eine asynchrone Version. Er ändert .Start() in .StartAsync() und markiert das Lambda async. Jetzt verhält sich der Kontextparameter wie async ctx.

Darin verwendet er anstelle von Thread.Sleep await Task.Delay(500) (4:58). Dies gibt dem System während der Wartezeit die Kontrolle zurück. In einem realen Programm warten Sie vielleicht auf eine echte Operation, wie await client.DownloadAsync() oder await AnsiConsole.MarkupAsync(), um einen Statustext neben dem Balken zu drucken.

Die asynchrone Version funktioniert visuell genau gleich (5:16-5:23), ist aber besser für moderne asynchrone Arbeitsabläufe geeignet. Tim zeigt es nicht, aber Sie könnten auch Ausnahmen mit try/catch (Exception ex) um Ihre erwarteten Aufgaben herum erfassen.

Spectre Console Live Progress Bars 1 related to Asynchron mit Await Task arbeiten

AutoClear und Nachbearbeitung

Tim bemerkt, dass Spectre.Console die abgeschlossenen Aufgaben auf dem Bildschirm standardmäßig bei 100 % belässt. Wenn Sie möchten, dass sie automatisch verschwinden, rufen Sie .AutoClear(true) auf, nachdem Sie Ihren Fortschritt eingerichtet haben (5:42). Sobald die Arbeit beendet ist, verschwinden die Balken sofort (6:02).

Spectre Console Live Progress Bars 2 related to AutoClear und Nachbearbeitung

Dies ist nützlich, wenn Sie nur vorübergehend einen Fortschrittsbericht anzeigen müssen und die Konsolenausgabe nicht überladen wollen. In Kombination mit interaktiven Eingabeaufforderungen, neuen Bedienfeldanzeigen oder sogar einer var-Tabelle aus Spectre.Console können Sie eine dynamische Konsolen-Benutzeroberfläche im Dashboard-Stil erstellen.

Über die Grundlagen hinaus - Verschiedene Stile und Spalten

In den letzten Minuten erwähnt Tim (6:11), dass es noch viel mehr zu entdecken gibt. Sie können Formate, Farben und Layouts ändern und verschiedene Spaltentypen verwenden. Sie können zum Beispiel ein neues BarChart oder eine neue Tabelle hinzufügen oder ein neues Panel mit Fortschrittsbalken kombinieren, um gruppierte Ergebnisse anzuzeigen.

Die Spectre.Console-Dokumentation zeigt, wie man neue ProgressColumn-Implementierungen einbindet, den Maximalwert jeder Aufgabe anpasst oder sogar mehrere Aufgaben in einem einzigen Balken zusammenfasst, um Platz zu sparen ("folding space"). Sie könnten diese verwenden, um Zählungen, Gesamtzahlen, Dateinamen, Benutzernamen oder verarbeitete Passwörter anzuzeigen - alles schön formatiert innerhalb Ihrer Konsolenanwendung.

Abschluss

Tim, am Ende seines Videos:

  • Ein von Grund auf neu erstellter Fortschrittsbalken der Spectre-Konsole

  • Wie man mehrere Fortschrittsaufgaben definiert und aktualisiert

  • Wie man es synchron mit Thread.Sleep oder asynchron mit await Task.Delay ausführt

  • Verwendung von .AutoClear(true) zum Löschen von fertigen Balken

  • Wohin für fortgeschrittenes Styling und Dokumentation

Diese kleine Demo zeigt, wie einfach Sie professionell aussehende Fortschrittsbalken in jedes C#-Konsolenprogramm bringen können. Mit dem NuGet-Paket von Spectre.Console und ein paar Zeilen Code können Sie den Status und die Prozentsätze anzeigen und Ihren Benutzern einen besseren Überblick über die Aktivitäten Ihrer Anwendung verschaffen.

Hero Worlddot related to Live-Fortschrittsbalken - Spectre Console Series
Hero Affiliate related to Live-Fortschrittsbalken - Spectre Console Series

Verdienen Sie mehr, indem Sie teilen, was Sie lieben

Erstellen Sie Inhalte für Entwickler, die mit .NET, C#, Java, Python oder Node.js arbeiten? Verwandeln Sie Ihr Fachwissen in ein zusätzliches Einkommen!

Iron Support Team

Wir sind 24 Stunden am Tag, 5 Tage die Woche online.
Chat
E-Mail
Rufen Sie mich an