實時狀態消息和旋轉器 - Spectre Console系列
Spectre Console 是一個強大的 .NET 程式庫,讓您能夠在不離開 C# 的情況下創建漂亮的控制台應用程式。 在他的一系列影片中,Tim Corey 一一介紹其功能。 在這個 關於"Live Status Messages and Spinners - Spectre Console Series"的影片中,Tim 著重介紹 Spectre Console Status,一個用於在控制台應用程式執行長時間任務時顯示即時狀態訊息和動畫旋轉器的工具。
在本文中,我們將藉由跟隨 Tim 的解說更深入地了解 Spectre Console 的狀態功能。 您將看到 Tim 如何首先設置一個簡單的載入旋轉器,然後進行自訂,最後在一個更真實、非同步的例子中使用它下載資料。 在演示結束時,您將看到 Spectre Console 如何使系統便於用戶清楚瞭解後台運行的情況。
從簡單的狀態範例開始 (0:31)
Tim 從展示一個狀態訊息的最簡單範例開始。 他呼叫:
AnsiConsole.Status()
.Start("Loading...", ctx =>
{
Thread.Sleep(3000);
});
這是向控制台專案添加狀態指示器的最直接方式。 他解釋說,在大括號內,您可以執行任何命令或運行任何需要時間的程式碼。在演示中,Tim 僅使用三秒鐘的延遲來模擬一個緩慢的操作。
運行此控制台應用程式時,您會立即在行上看到"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,Tim 暫停來解釋這個功能為什麼重要。 如果您的應用程式正在創建或下載文件、處理資料或執行任何耗時的操作,具有旋轉器的狀態訊息"能讓用戶知道正在發生什麼"。沒有它,一個空白的控制台可能會看起來凍結。
Tim 強調任務完成時,狀態就消失,僅留下結果信息。 這有助於保持您的控制台應用程式既乾淨又具信息性。
過渡到 Async Work 使用 Await AnsiConsole (3:24)
到目前為止,Tim 使用 Start()。 但在實際應用程式中,您可能會等待操作。 在 3:34,他切換到:
await AnsiConsole.Status()
.StartAsync("Loading...", async ctx =>
{
// 非同步工作
});
這個小改變——使用 await AnsiConsole 和 .StartAsync()——讓您可以在狀態塊內運行非同步程式碼。 Tim 在 4:02 時提醒,內部的上下文對於界面更新來說不是線程安全的。 請務必"回到界面線程"來更改旋轉器或狀態文本。 這樣檢查可避免在嘗試從另一個線程更新時出現奇怪的錯誤。
下載資料循環 —— 更真實的演示 (4:26)
接下來,Tim 創建了一個循環來模擬一個現實世界的任務:從 API 下載 20 個課程。 他重寫程式碼如下所示:
for (int i = 1; i < 21; i++)
{
ctx.Status($"Download course {i}...");
var jsonResponse = await Helpers.Fetch("https://sample.com/courses/{i}");
AnsiConsole.MarkupLine("[red]Course {i} downloaded[/]");
}
在這裡,他展示了三個重要的 Spectre Console 功能一起工作:
-
Context.Status() 動態變更顯示在旋轉器旁邊的狀態字串。
-
await Helpers.Fetch(...) 代表在控制台應用程式內的一個真實的非同步任務。
- AnsiConsole.MarkupLine() 使用 Spectre 的標記來添加顏色。 Tim 選擇 [red] 只是"為了好玩。"
這個例子展示了如何輕鬆將進度反饋添加到專案中而不需複雜的程式碼。
查看運行中的應用程式 (7:21)
當 Tim 運行新代碼時,您看到一個綠色的旋轉器(他主題中的 Aesthetic 類型)和狀態文本更改為"Downloading course 1…"、"Downloading course 2…"等。隨著每次下載完成,一條紅線出現:"Course 1 downloaded"、"Course 2 downloaded。"

Tim 指出這是跟踪諸如上傳資料或處理文件等任務的一個好方法。 "您留下的是結果訊息,但您不再有那個與下載相關的等待訊息,"他在 7:27 時解釋。

同步與非同步 —— 沒有性能差異 (8:00)
在 8:00,Tim 談到性能。 使用 Start() 及 StartAsync() 不會改變旋轉器動畫的速度。 重要的是您內部的程式碼是否為非同步的。 如果您使用 await,您需要 .StartAsync(); 否則,.Start() 也可以。
這意味著您可以將狀態反饋添加到控制台應用程式中而不必擔心它變慢。 它只是包裝了您已經在執行的工作。
內建與自訂旋轉器 —— 長長的列表可供檢查 (8:45)
在結束時,Tim 強調 Spectre Console 提供"大量"的內建旋轉器。 您可以滾動列表並選擇自己喜歡的——從點到箭頭再到"審美"。在系列的後面,Tim 將展示如何創建自訂旋轉器,以便您能完全符合應用程式的品牌或顏色。
這種靈活性是使 Spectre Console 成為構建漂亮控制台應用程式的好工具的部分原因。 它為您提供進度反饋、提示輸出和動態視覺效果而不需重新發明車輪。
總結 —— Spectre Console Status的實際應用 (9:07)
通過跟隨 Tim Corey 的 影片,我們看到了如何使用 Spectre Console Status 來改進 .NET 的控制台應用程式:
-
使用 AnsiConsole.Status().Start() 或 await AnsiConsole.Status().StartAsync() 來顯示旋轉器和狀態文本以執行任務。
-
在您的循環內動態更新 context.Status()。
-
使用 AnsiConsole.MarkupLine() 和 Spectre 標記以紅、綠或其他顏色顯示輸出結果。
-
從內建的旋轉器列表中選擇或稍後創建您自己的。
- 為用戶提供清晰的信息,同時保持控制台輸出乾淨。
這些小細節可以將一個普通的控制台專案變成一個漂亮的控制台應用程式。 Spectre Console 的狀態功能使分享進度、檢查結果以及使您應用程式的提示更具互動性更為簡單。
