IRONSOFTWAREHOME

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

实时进度条 - 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) 捕获等待任务周围的异常。

自动清除和整理

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

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

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

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

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

结论

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

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

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

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

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

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

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

Earn More by Sharing What You Love

Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Let's Stay in Touch!

Join our newsletter, you’ll get exclusive access on article updates. We value your privacy

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户