ライブステータスメッセージとスピナー - Spectre Console シリーズ
Spectre Console は、C# にいながらにして美しいコンソールアプリケーションを作成できる、強力な .NET ライブラリです。 彼のビデオシリーズでは、ティム・コーリーがその機能を一つずつ説明しています。 ライブ ステータス メッセージとスピナー - Spectre コンソール シリーズ"のビデオでは、コンソール アプリケーションが長時間実行するタスクの実行中にライブ ステータス メッセージとアニメーション スピナーを表示するツールである Spectre Console Status に焦点を当てています。
この記事では、Tim の説明に沿って Spectre Console のステータス機能を詳しく見ていきます。 Timがどのように単純なローディングスピナーをセットアップし、それをカスタマイズし、最後にデータをダウンロードするためのより現実的で非同期な例でそれを使用するかをご覧いただけます。 デモが終わるころには、Spectre Console がどのようにユーザーに、舞台裏で起こっていることに関する明確な情報を提供しやすくしているかがわかるでしょう。
より単純なステータスの例から始める (0:31)
Timは、ステータスメッセージの最も簡単な例を示すことから始めます。 と彼は言います:
AnsiConsole.ステータス()
.Start("Loading...", ctx =>)
{
Thread.Sleep(3000);
});これは、コンソールプロジェクトにステータスインジケータを追加する最も簡単な方法です。 彼は、中括弧の中ではどんなコマンドでも実行でき、時間のかかるコードでも実行できると説明する。デモでは、ティムは3秒間のスリープを使って低速処理をシミュレートしているだけだ。
このコンソールアプリケーションを実行すると、すぐにデフォルトのスピナーとともに"Loading..."という文字列が表示されます。 この簡単なデモでは、Spectre Console がどのようにプレーンなプロンプトをよりダイナミックなものに変えることができるかを示しています。

スピナーのカスタマイズ - サポートされているタイプ (1:54)
1:54、Timはカスタマイズに移る。 Spectre Console には、組み込みのスピナータイプの長いリストがあり、それらを変更することができます:
ctx.Spinner = Spinner.Known.Aesthetic;彼は利用可能なタイプをスクロールし、スピナーの形式を簡単に変更できることを示すために "Aesthetic "を選びます。 このような小さな変更は、すでにあなたのコンソールアプリケーションをより洗練されたものにします。

Timは2:39で、すべての端末がすべてのスピナーを完全にサポートしているわけではないことも指摘している。 Visual Studio内で実行している場合、フォールバックアニメーションが表示されることがあります。 これは、Spectre Console がエラーを潔く処理する方法であり、ユーザーがフィードバックを得られるように、環境に適したよりシンプルなスピナーを自動的に選択します。
コンソール アプリケーションがユーザーにとって簡単になる理由 (3:07)
3:07でティムは、なぜこの機能が重要なのかを説明するために一時停止します。 アプリがファイルを作成したりダウンロードしたり、データを処理したり、何か時間のかかることをしている場合、スピナー付きのステータスメッセージは"ユーザーに何かが起こっていることを知らせる"ものです。これがないと、空白のコンソールがフリーズしたように見えるかもしれません。
ティムは、タスクが完了するとステータスが消え、結果情報だけが残ることを強調する。 これは、コンソールアプリケーションをきれいに保つと同時に、有益な情報を提供するのに役立ちます。
非同期作業のために AnsiConsole を待つ (3:24)
ここまで、TimはStart()を使用してきました。 しかし、実際のアプリケーションでは、おそらく操作を待っていることでしょう。 3:34、彼はこう切り替えた:
AnsiConsole.ステータス() を待つ
.StartAsync("Loading...", async ctx =>)
{
// 非同期作業
});この小さな変更 - await AnsiConsole と .StartAsync()- を使用することで、ステータス・ブロック内で非同期コードを実行できます。 Timは4:02で、内部のコンテキストはUI更新のためにスレッドセーフではないことを警告している。 スピナーやステータステキストを変更するには、常に"UIスレッドに戻って"ください。 このチェックにより、別のスレッドから更新しようとしたときに奇妙なエラーが発生するのを避けることができます。
ループ内のデータのダウンロード - より現実的なデモ (4:26)
次に、Timは、APIから20のコースをダウンロードするという実際のタスクをシミュレートするループを作成します。 彼はコードを次のように書き換えます:
for (int i = 1; i < 21; i++)
{
ctx.Status($"ダウンロードコース{i}...");
var jsonResponse = await Helpers.Fetch($"https://sample.com/courses/{i}");
AnsiConsole.MarkupLine($"[red]Course {i} downloaded[/]");
}ここでは、Spectre Console の 3 つの重要な機能が連携して動作していることを示しています:
Context.Status() は、スピナーの横に表示されるステータス文字列を動的に変更します。
await Helpers.Fetch(...)は、コンソールアプリケーション内の実際の非同期タスクを表します。
- AnsiConsole.MarkupLine() は、色を追加するために Spectre のマークアップを使用します。 ティムは、"何か楽しいことをしたいから"︕︕︕︕︕を選んでいます。
この例では、複雑なコードがなくても、プロジェクトに進捗フィードバックを簡単に追加できることを示しています。
実行中のアプリケーションを見る (7:21)
ティムが新しいコードを実行すると、緑色のスピナー(彼のテーマではAestheticタイプ)が表示され、ステータスのテキストが"コース1をダウンロード中..."、"コース2をダウンロード中..."などに変わります。各ダウンロードが終了すると、赤い線が表示される:"コース1をダウンロードしました"、"コース2をダウンロードしました"。

ティムは、これはデータのアップロードやファイルの処理のようなタスクを追跡するのに最適な方法であると指摘しています。 "結果のメッセージは残しますが、ダウンロード待ちのメッセージはもうありません"と、彼は7:27で説明する。

同期 vs. 非同期 - パフォーマンスに違いはない (8:00)
8:00にティムはパフォーマンスについて説明する。 Start() と StartAsync() を使用しても、スピナーのアニメーションの速さは変わりません。 重要なのは、中のコードが非同期かどうかだけです。 awaitを使っているなら、.StartAsync()が必要です; それ以外の場合は、.Start()でも構いません。
つまり、コンソール・アプリケーションにステータス・フィードバックを追加しても、動作が遅くなる心配はありません。 あなたがすでに行っている作業を、単純にラップします。
ビルトインとカスタムスピナー - チェックすべき長いリスト (8:45)
最後に、Tim は Spectre Console が"大量の"組み込みスピナーを提供することを強調します。 リストをスクロールして、好きなものを選ぶことができます。シリーズの後半では、アプリのブランディングや色に完全にマッチするように、カスタムスピナーを作成する方法を紹介します。
この柔軟性は、Spectre Console が美しいコンソールアプリケーションを構築するための優れたツールである理由の一部です。 車輪の再発明をすることなく、進捗状況のフィードバック、迅速な出力、ダイナミックなビジュアルを提供します。
おわりに - Spectre コンソール ステータスの動作 (9:07)
Tim Corey 氏の video に従って、Spectre Console Status を使用して .NET コンソール アプリケーションを改善する方法を見てきました:
AnsiConsole.ステータス().Start() または AnsiConsole.ステータス() を待つ.StartAsync() を使用して、タスクの実行中にスピナーとステータス・テキストを表示します。
ループ内で動的に context.Status() を更新します。
AnsiConsole.MarkupLine()と赤、緑、または他の色のSpectreマークアップで結果を出力します。
組み込みのスピナーのリストから選択するか、後で独自のスピナーを作成してください。
- コンソール出力をきれいに保ちながら、ユーザーに明確な情報を提供すること。
このような小さな工夫が、普通のコンソールプロジェクトを美しいコンソールアプリケーションに変えます。 Spectre Console のステータス機能により、進捗状況の共有や結果の確認が簡単になり、アプリのプロンプトがより親しみやすくインタラクティブになります。

