jk's notes
  • ShellProgressBar

ShellProgressBar

该库用于在控制台显示进度条.

网址: https://www.nuget.org/packages/ShellProgressBar

安装:

dotnet add package ShellProgressBar --version 5.2.0

该库还支持子进度条.

基本用法

const totalTicks = 10;
var options = new ProgressBarOptions {
  ProgressCharacter = '-',
  ProgressBarOnBottom = true
};
using (var pbar = new ProgressBar(totalTicks, "初始化标题", options)) {
  pbar.Tick(); // 会递进一个进度. 
  // 也可以在更新进度的时候, 更新文字信息
  pbar.Tick("步骤 2 / 10");
}

报告进度

有两种更新进度的方法. 上面的用法使用 Tick() 方法. 第二个方法是使用 IProgress<T> 实例来提交报告, 来更新进度. 该实例可以使用 AsProgress<T>() 方法来获得.

例如:

using ProgressBar progressBar = new ProgressBar(10000, "提示消息");
var progress = progressBar.AsProgress<float>();
progress.Report(0.25); // 推进 25% 的进度.

选项

进度条位置

const int totalTicks = 10;
var options = new ProgressBarOptions {
  ProgressCharacter = '-',
  ProgressBarOnBottom = true
};
using var pbar = new ProgressBar(totalTicks, "进度条在底部", options);
TickToCompletion(pbar, totalTicks, sleet: 500);

默认情况下, 进度条在消息的上方. 如果需要可以翻转过来.

修改样式

const int totalTicks = 10;
var options = new ProgressBarOptions {
  ForegroundColor = ConsoleColor.Yellow,
  ForegroundColorDone = ConsoleColor.DarkGreen,
  BackgroundColor = ConsoleColor.DarkGray,
  BackgroundCharacter = '\u2593'
};
using var pbar = new ProgressBar(totalTicks, "显示关闭样式", options);
TickToCompletion(pbar, totalTicks, sleep: 500);

可以配置前景颜色, 完成颜色, 以及背景颜色等.

非实时更新

默认情况下, 计时器会每隔 500ms 绘制一次屏幕. 可以配置仅在调用 .Tick() 时重绘.

const int totalTicks = 5;
var options = new ProgressBarOptions {
  DisplayTimeInRealTime = false
};
using var pbar = new ProgressBar(totalTicks, "只在 Tick 时绘制进度", options);
TickToCompletion(pbar, totalTicks, sleep: 1750);

子进度条

进度条可以有子进度条, 并且可以有单独的样式. 这个处理并行任务很有效.

const int totalTicks = 10;
var options = new ProgressBarOptions {
  ForegroundColor = ConsoleColor.Yellow,
  BackgroundColor = ConsoleColor.DarkYellow,
  ProgressCharacter = '-'
};
var childOptions = new ProgressBarOptions {
  ForegroundColor = ConsoleColor.Green,
  BackgroundColor = ConsoleColor.DarkGreen,
  ProgressCharacter = '-'
};
using var pbar = new ProgressBar(totalTicks, "主进度条", options);
TickToCompletion(pbar, totalTicks, sleep: 10, childAction: () => {
  using var child = pbar.Spawn(totalTicks, "子任务", childOptions);
  TickToCompletion(child, totalTicks, sleep: 100);
});

子进度条完成后会自动折叠, 为其他并行任务腾出空间. 可以使用配置 CollapseWhenFinished = false 来禁用自动折叠.

var childOptions = new ProgressBarOptions {
  ForegroundColor = ConsoleColor.Green,
  BackgroundColor = ConsoleColor.DarkGreen,
  ProgressBarCharacter = '-',
  CollapseWhenFinished = false
};

FixedDurationBar

该类提供固定时长的进度条, 它会自动的进行递进.

通常会使用其暴露出的 IsCompleted 与 CompletedHandle.

Last Updated:
Contributors: jk