Wiadomości statusu na żywo i spinnery - seria Spectre Console
Spectre Console to potężna biblioteka .NET, która pozwala tworzyć piękne aplikacje konsolowe bez opuszczania środowiska C#. W swoim cyklu wideo Tim Corey przechodzi przez jego funkcje krok po kroku. W tym wideo "Live Status Messages and Spinners - Spectre Console Series", Tim skupia się na Spectre Console Status, narzędziu do pokazywania wiadomości o stanie na żywo i animowanych spinnerów podczas gdy aplikacja konsolowa wykonuje zadanie długoterminowe.
W tym artykułe przyjrzymy się bliżej funkcji statusu Spectre Console, śledząc wyjaśnienia Tima. Zobaczysz, jak Tim najpierw ustawia prosty spinner ładowania, następnie dostosowuje go, a na końcu używa go w bardziej realistycznym, asynchronicznym przykładzie do pobierania danych. Pod koniec pokazu zobaczysz, jak Spectre Console ułatwia przekazywanie użytkownikowi jasnych informacji o tym, co dzieje się w tle.
Zaczynamy od prostszego przykładu statusu (0:31)
Tim zaczyna od pokazania najprostszych przykładów wiadomości o statusie. Wywołuje:
AnsiConsole.Status()
.Start("Ładowanie...", ctx =>
{
Thread.Sleep(3000);
});
To najprostszy sposób, aby dodać wskaźnik statusu do projektu konsolowego. Wyjaśnia, że wewnątrz klamr można wykonać dowolne polecenia lub uruchomić dowolny kod, który zajmuje czas. W pokazie Tim używa tylko trzysekundowego sleep, aby zasymulować powolną operację.
Podczas uruchamiania tej aplikacji konsolowej natychmiast widać napis "Ładowanie…" na linii wraz z domyślnym spinnerem. Ten szybki pokaz demonstruje, jak Spectre Console może przekształcić nawet zwykły prompt w coś bardziej dynamicznego.

Dostosowywanie spinnera – Obsługiwane typy (1:54)
O 1:54 Tim przechodzi do dostosowywania. Spectre Console ma długą listę wbudowanych typów spinnerów, które można zmienić za pomocą:
ctx.Spinner = Spinner.Known.Aesthetic;
Przewija dostępne typy i wybiera "Aesthetic", aby pokazać, że format spinnera można łatwo zmienić. Tego typu mała zmiana już sprawia, że aplikacja konsolowa wygląda bardziej dopracowana.

Tim zauważa również o 2:39, że nie każdy terminal w pełni wspiera każdy spinner. Jeżeli pracujesz w Visual Studio, możesz zobaczyć zapasową animację. To sposób Spectre Console na eleganckie obsługiwanie błędów — automatycznie wybiera prostszy spinner, który działa w Twoim środowisku, dzięki czemu użytkownik nadal otrzymuje feedback.
Dłączego to ułatwia użytkowanie aplikacji konsolowych (3:07)
O 3:07 Tim przerywa, aby wyjaśnić, dłączego ta funkcja ma znaczenie. Jeśli Twoja aplikacja tworzy lub pobiera pliki, przetwarza dane lub robi cokolwiek czasochłonnego, wiadomość o statusie ze spinnerem "informuje użytkownika, że coś się dzieje." Bez niej, pusta konsola mogłaby wyglądać na zamrożoną.
Tim podkreśla, że gdy zadanie się zakończy, status znika, pozostawiając jedynie informacje o wynikach. To pomaga utrzymać aplikację konsolową zarówno czystą, jak i informacyjną.
Przechodzenie do Await AnsiConsole do pracy asynchronicznej (3:24)
Do tego momentu Tim używał Start(). Jednak w rzeczywistych aplikacjach prawdopodobnie czekasz na operacje. O 3:34 przechodzi do:
await AnsiConsole.Status()
.StartAsync("Ładowanie...", async ctx =>
{
// praca asynchroniczna
});
Ta mała zmiana — użycie await AnsiConsole i .StartAsync() — pozwala uruchomić kod asynchroniczny wewnątrz bloku statusu. Tim ostrzega o 4:02, że kontekst wewnątrz nie jest bezpieczny wątkowo dla aktualizacji UI. Zawsze "wracaj do wątku UI", aby zmienić spinner lub tekst statusu. Ta kontrola unika dziwnych błędów, gdy próbujesz aktualizować z innego wątku.
Pobieranie danych w pętli – Bardziej realistyczna demonstracja (4:26)
Następnie Tim tworzy pętlę, aby zasymulować zadanie z rzeczywistego świata: pobieranie 20 kursów z API. Przepisuje kod, aby wyglądał tak:
for (int i = 1; i < 21; i++)
{
ctx.Status($"Pobieranie kursu {i}...");
var jsonResponse = await Helpers.Fetch("https://sample.com/courses/{i}");
AnsiConsole.MarkupLine("[red]Kurs {i} pobrany[/]");
}
Tutaj pokazuje trzy ważne funkcje Spectre Console działające razem:
-
Context.Status() dynamicznie zmienia tekst statusu pokazywany obok spinnera.
-
await Helpers.Fetch(...) reprezentuje prawdziwe zadanie asynchroniczne wewnątrz Twojej aplikacji konsolowej.
- AnsiConsole.MarkupLine() używa znaczników Spectre do dodawania kolorów. Tim wybiera [red] tylko "żeby robić coś zabawnego."
Ten przykład pokazuje, jak łatwo można dodać feedback o postępie do projektu bez skomplikówanego kodu.
Obejrzenie działającej aplikacji (7:21)
Gdy Tim uruchamia nowy kod, widzisz zielony spinner (typ Aesthetic w jego motywie) i tekst statusu zmieniający się na "Pobieranie kursu 1…," "Pobieranie kursu 2…," itd. Gdy każde pobieranie się kończy, pojawia się czerwona linia: "Kurs 1 pobrany," "Kurs 2 pobrany."

Tim zauważa, że to świetny sposób na śledzenie zadań, takich jak przesyłanie danych czy przetwarzanie plików. "Pozostawiasz za sobą wiadomości o wynikach, ale nie ma już tej wiadomości o czekaniu na pobieranie," wyjaśnia o 7:27.

Synchronizacyjne vs. Asynchronizacyjne – Brak różnicy w wydajności (8:00)
O 8:00 Tim porusza kwestię wydajności. Użycie Start() w porównaniu do StartAsync() nie wpływa na to, jak szybko animuje się spinner. To ma znaczenie tylko wtedy, gdy kod wewnętrzny jest asynchroniczny. Jeśli używasz await, potrzebujesz .StartAsync(); w przeciwnym razie, .Start() wystarczy.
Oznacza to, że możesz dodać feedback o statusie do swojej aplikacji konsolowej bez obaw o spowolnienie jej działania. Po prostu otacza to, co już robisz.
Wbudowane i niestandardowe spinnery – Długa lista do sprawdzenia (8:45)
Kończąc, Tim podkreśla, że Spectre Console oferuje "mnóstwo" wbudowanych spinnerów. Możesz przeglądać listę i wybrać ten, który Ci się podoba — wszystko od kropek do strzałek do "estetycznych." Później w serii Tim pokaże, jak stworzyć własny spinner, aby móc w pełni dopasować branding lub kolory Twojej aplikacji.
Ta elastyczność jest częścią tego, co sprawia, że Spectre Console to świetne narzędzie do budowania pięknych aplikacji konsolowych. Daje Ci feedback o postępie, wyjście promp, i dynamiczne wizualizacje bez ponownego wymyślania koła.
Podsumowanie – Spectre Console Status w akcji (9:07)
Podążając za wideo Tima Coreya, zobaczyliśmy, jak używać Spectre Console Status, aby poprawić aplikację konsolową .NET:
-
Użyj AnsiConsole.Status().Start() lub await AnsiConsole.Status().StartAsync(), aby pokazać spinner i tekst statusu podczas gdy zadanie jest wykonywane.
-
Dynamicznie aktualizuj context.Status() wewnątrz swojej pętli.
-
Wyjście wyników za pomocą AnsiConsole.MarkupLine() i znaczników Spectre dla czerwonego, zielonego lub innych kolorów.
-
Wybierz z wbudowanej listy spinnerów lub stwórz własny później.
- Dostarcz jasnych informacji użytkownikowi, jednocześnie utrzymując czystość wyjścia konsoli.
Te małe akcenty mogą zamienić zwykły projekt konsolowy w piękną aplikację konsolową. Funkcja statusu Spectre Console ułatwia dzielenie się postępem, sprawdzanie wyników i sprawianie, by prompt Twojej aplikacji był bardziej przyjazny i interaktywny.
