跳至页脚内容
Iron Academy Logo
C# 应用程序
C# 应用程序

其他类别

实时进度条 - Spectre 控制台系列

Tim Corey
7分04秒

Spectre.Console 库就是要将普通的 C# 控制台应用程序转变为视觉效果好、信息量大的工具。 它最引人注目的功能之一是能够显示进度条,随着应用程序的运行而更新。 这对于需要让用户了解情况的长期任务非常有帮助。

在他的"实时进度条 - Spectre Console 系列"视频中,Tim Corey 逐步展示了如何创建 C# Spectre Console 进度条。

设置控制台应用程序

在视频开头(0:00),Tim 介绍了 Spectre.Console 控制台库,并显示视频下方有源代码链接。 他提醒观众,这些都是 10 分钟的片段,您可以将其纳入您的日常工作中。

Tim 正在一个普通的 C# 控制台应用程序中工作--想想一个简单的模板文件,其中包含类 Program 和 static void Main(string[] args)。 他没有使用任何特殊的 UI 框架,只是引用了 Spectre.Console 的 NuGet 包。 这是一个很好的提醒,您可以将这些功能带入任何 Windows 终端或控制台主机。

创建进度上下文

0:34 时,Tim 开始编码。 在 Main 方法中,他调用了 AnsiConsole.Progress(),然后调用了 .Start()。 这是 Spectre.Console 中进度条的标准入口点。

他向我们展示了通过上下文参数传递 lambda 的方法,我们可以将其视为异步ctx。 在这种情况下,您需要确定自己的任务。 这就相当于 Spectre.Console 在您开始更新进度任务之前对其进行设置。

添加进度任务

Tim 创建了三个进度任务:

  • "下载数据

  • "安装应用程序

  • "数据清理

每个任务都是通过 var task = context.AddTask("...") 添加的。 这些返回的任务句柄可以在以后进行增量。 蒂姆指出(1:22),他只是触及了皮毛--Spectre.Console 支持不同的样式、列和布局,例如添加新的 ProgressBarColumn、新的 PercentageColumn、新的 SpinnerColumn 或新的 TaskDescriptionColumn 来定制栏的外观。

他将这些任务比作 Visual Studio 的安装程序:下载、安装,然后清理(1:42)。 您可以想象每个任务在更新时内部都持有一个 int 百分比或 int 值。

更新进度条

1:50 时,Tim 设置了一个 while 循环,运行直到上下文结束。 在实际的 C# 控制台程序中,您可能会在 Main 方法内写入 while (!context.IsFinished) 或 while (context.IsFinished == false)。

在循环内部,他调用 Thread.Sleep(500) 来减缓运行速度(2:15)。 然后,他调用 task.Increment(),用随机双乘以最大值(2:29,2:47)。 这将模拟正在进行的工作。

他以不同的速度更新任务一和任务二,并为任务三添加了一个 if 检查(3:05),只有当任务二的百分比大于 80 时,任务三才会启动。这主要是控制进度任务之间的依赖关系。

虽然 Tim 并没有在foreach 循环中键入 int i,但您可以想象使用foreach 循环迭代任务,并为每个任务调用 .Increment(int) 。 在生产过程中,您可能会有真实的数据,如 var 客户端下载文件,或正在处理的字符串文件名。 蒂姆用随机数字来显示,保持简单。

显示和观察进度条

3:47 时,Tim 运行控制台应用程序。 进度条呈堆叠状。 每个条形图在最后显示一个百分比,完成后变为绿色(4:01)。 第一批任务完成后,"数据清理 "就开始了。

4:14 时,Tim 指出光标会返回到控制台的底部,这是一个很小但很重要的可用性细节。 Spectre.Console 进度条会自动格式化状态,并保持一切正常,不会闪烁。

使用等待任务实现异步

4:36 时,Tim 切换到异步版本。 他将 .Start() 改为 .StartAsync() 并将 lambda 标记为 async。 现在,上下文参数的行为类似于 async ctx。

其中,他使用 await Task.Delay(500) 代替 Thread.Sleep(4:58)。 这将在等待期间将控制权交还给系统。 在真实的程序中,您可能正在等待一个真实的操作,例如 await client.DownloadAsync() 或 await AnsiConsole.MarkupAsync() 以在条形图旁打印状态文本。

异步版本的视觉效果完全相同(5:16-5:23),但更适合现代异步工作流。 Tim 并未展示,但您也可以使用 try/catch (Exception ex) 捕获等待任务周围的异常。

Spectre Console Live Progress Bars 1 related to 使用等待任务实现异步

自动清除和整理

Tim 注意到,Spectre.Console 默认情况下会将已完成的任务 100% 显示在屏幕上。 如果希望它们自动消失,请在设置进度后调用 .AutoClear(true) (5:42)。 工作完成后,条形图立即消失(6:02)。

Spectre Console Live Progress Bars 2 related to 自动清除和整理

当您只需要临时显示进度报告,而不希望控制台输出杂乱无章时,这就非常有用了。 结合 Spectre.Console 中的交互式提示、新面板显示,甚至是变量表,您可以创建一个动态仪表盘风格的控制台用户界面。

超越基础--不同的样式和列

在最后几分钟,Tim 提到(6:11)还有很多内容需要探索。 您可以更改格式、颜色、布局并使用不同的列类型。例如,您可以添加新的条形图、新的表格,或将新的面板与进度条相结合以显示分组结果。

Spectre.Console 文档展示了如何混合新的 ProgressColumn 实现,或调整每个任务的最大值,甚至将多个任务折叠到一个条形图中以节省空间("折叠空间")。 您可以用它们来显示正在处理的计数、总数、文件名、用户名或密码--所有这些都可以在您的控制台应用程序中格式化。

结论

视频的最后,蒂姆介绍了以下内容:

  • 从零开始构建的 Spectre 控制台进度条

  • 如何定义和更新多个进度任务

  • 如何使用 Thread.Sleep 同步运行,或使用 await Task.Delay 异步运行

  • 如何使用 .AutoClear(true) 清除已完成的条形图

  • 如何获得更高级的样式和文档

这个小演示展示了如何轻松地将专业外观的进度条引入任何 C# 控制台程序。 只需使用 Spectre.Console 的 NuGet 软件包和几行代码,您就可以显示状态、显示百分比,并让用户更清楚地了解您的应用程序正在做什么。

Hero Worlddot related to 实时进度条 - Spectre 控制台系列
Hero Affiliate related to 实时进度条 - Spectre 控制台系列

分享您的所爱,赚取更多收入

您为使用 .NET、C#、Java、Python 或 Node.js 的开发人员创建内容吗?将您的专业知识转化为额外收入!

钢铁支援团队

我们每周 5 天,每天 24 小时在线。
聊天
电子邮件
打电话给我