实时状态信息和旋转器 - Spectre 控制台系列
Spectre Console 是一个功能强大的 .NET 库,让您无需离开 C# 即可创建精美的控制台应用程序。 在他的视频系列中,Tim Corey 逐一介绍了这些工具的功能。 在本视频"实时状态消息和旋转器 - Spectre Console 系列"中,Tim 重点介绍了 Spectre Console Status,这是一种在控制台应用程序执行长期运行任务时显示实时状态消息和动画旋转器的工具。
在本文中,我们将根据 Tim 的解释深入了解 Spectre Console 的状态功能。 您将看到 Tim 如何首先设置一个简单的加载旋转器,然后对其进行定制,最后在一个更现实的异步示例中使用它来下载数据。 演示结束后,您将看到 Spectre Console 如何让用户更轻松地了解幕后发生的事情。
从简单的状态示例开始(0:31)
Tim 首先展示了状态信息的最简单示例。 他要求
AnsiConsole.Status()
.Start("正在加载......",ctx =>.
{
Thread.Sleep(3000);
});这是在控制台项目中添加状态指示器的最直接方法。 他解释说,在大括号内,你可以执行任何命令或运行任何需要时间的代码。在演示中,Tim 只使用了三秒钟的休眠来模拟缓慢的操作。
运行该控制台应用程序时,您会立即看到 "正在加载...... "字符串和一个默认的旋转器。 这个快速演示展示了 Spectre Console 如何将普通的提示语变成更具活力的内容。

自定义旋转器 - 支持的类型(1:54)
1:54 时,Tim 开始介绍定制。 Spectre Console 自带一长串内置旋转器类型,您可以使用以下工具更改它们:
ctx.Spinner = Spinner.Known.Aesthetic;他滚动浏览了可用类型,并选择了 "美学",以显示旋转器的格式可以轻松更改。 这种小改动就能让您的控制台应用程序看起来更加完美。

Tim 还在 2:39 处指出,并非每个终端都完全支持每种旋转器。 如果您在 Visual Studio 中运行,可能会看到回退动画。 这是 Spectre Console 从容应对错误的方法--它会自动选择适合您环境的更简单的旋转器,以便用户仍能获得反馈。
为什么这能让用户更轻松地使用控制台应用程序(3:07)
在 3:07 处,Tim 停顿了一下,解释了为什么这个功能很重要。 如果您的应用程序正在创建或下载文件、处理数据或进行任何耗时的操作,那么带有旋转器的状态信息 "可以让用户知道正在发生什么"。如果没有状态信息,空白的控制台可能会显得很死板。
Tim 强调,任务完成后,状态将消失,只留下结果信息。 这有助于保持您的控制台应用程序的简洁性和信息量。
移动到等待 AnsiConsole 以进行异步工作(3:24)
到目前为止,Tim 一直使用 Start()。 但在实际应用中,您可能正在等待操作。 3:34 时,他切换到了:
等待 AnsiConsole.Status()
.StartAsync("Loading...", async ctx =>)
{
// 异步工作
});这个小改动--使用 await AnsiConsole 和 .StartAsync()- 可以让您在状态块内运行异步代码。 Tim 在 4:02 提醒大家,内部上下文对于 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 一起工作的三个重要功能:
Context.Status() 可动态更改旋转器旁边显示的状态字符串。
await Helpers.Fetch(...) 表示控制台应用程序中一个真实的异步任务。
- AnsiConsole.MarkupLine() 使用 Spectre 的标记来添加颜色。 蒂姆选择 (red/)只是 "为了找点乐子"。
本示例展示了如何在没有复杂代码的情况下轻松为项目添加进度反馈。
查看运行中的应用程序(7:21)
当蒂姆运行新代码时,你会看到一个绿色的旋转器(在他的主题中是美学类型),状态文本变为 "正在下载课程 1......"、"正在下载课程 2...... "等。每次下载完成后,都会出现一条红线:"课程 1 已下载"、"课程 2 已下载"。

Tim 指出,这是跟踪上传数据或处理文件等任务的好方法。 "他在 7 分 27 秒时解释说:"你会留下结果信息,但你不会再有下载时的等待信息。

同步与异步--性能无差别(8:00)
8:00 时,Tim 将讨论性能问题。 使用 Start() 与 StartAsync() 并不会改变旋转器的动画速度。 重要的是您的代码是否是异步的。 如果您使用 await,则需要 .StartAsync(); 否则,.Start() 即可。
这意味着您可以在控制台应用程序中添加状态反馈,而不必担心会降低速度。 它只需将您正在进行的工作简单包装一下即可。
内置和自定义旋转器 - 一长串需要检查的内容(8:45)
最后,Tim 强调说,Spectre Console 提供了 "大量 "内置旋转器。 您可以滚动列表,挑选自己喜欢的,从圆点、箭头到 "美学",应有尽有。在本系列的稍后部分,Tim 将向您展示如何创建自定义旋转器,这样您就可以完全匹配应用程序的品牌或颜色。
这种灵活性是 Spectre Console 成为构建精美控制台应用程序的绝佳工具的原因之一。 它能为您提供进度反馈、及时输出和动态视觉效果,而无需重新发明轮子。
结束语 - Spectre 控制台状态实际操作(9:07)
通过观看 Tim Corey 的视频,我们了解了如何使用 Spectre Console Status 改进 .NET 控制台应用程序:
使用 AnsiConsole.Status().Start() 或 等待 AnsiConsole.Status().StartAsync() 在任务执行时显示旋转器和状态文本。
在循环中动态更新 context.Status()。
使用 AnsiConsole.MarkupLine() 和 Spectre 标记红色、绿色或其他颜色输出结果。
您可以从内置列表中选择,也可以稍后自行创建。
- 向用户提供清晰的信息,同时保持控制台输出的整洁。
这些细小的润色可以将一个普通的控制台项目变成一个精美的控制台应用程序。 Spectre Console 的状态功能可让您更轻松地分享进度、检查结果,并使应用程序的提示更友好、更具互动性。

