如何在C#控制檯程序中漂亮的顯示進度條

ShellProgressBar庫的使用

控制檯程序有時也需要進度條來顯示任務執行的詳細進度,最近就發現了一個第三方的類庫叫ShellProgressBar,這個類庫可以在控制檯程序中完美的顯示進度條。ShellProgressBar是一個非常棒的庫,使用它,你可以在控制檯輸出一些非常驚豔的進度條。而且,ShellProgressBar是可以實現進度條的嵌套使用。而且也已經開始支持.net core。

1.visualize (concurrent) progress in your console application
2.This is a great little library to visualize long running command line tasks.
3.NET Core ready!
4.It also supports spawning child progress bars which allows you to visualize dependencies and concurrency rather nicely.

1. ShellProgressBar庫安裝

也是用NuGet來安裝 : http://www.nuget.org/packages/ShellProgressBar/
使用時引用:using ShellProgressBar;的命名空間

2. ShellProgressBar的使用

我們先來建一個模擬調用進度的方法,來執行進度。

// 請求退出執行
public static bool RequestToQuit { get; set; }
// 標記完成方法
public static void TickToCompletion(IProgressBar pbar, int ticks, int sleep = 1750, Action<int> childAction = null)
{
	var initialMessage = pbar.Message;
	for (var i = 0; i < ticks && !RequestToQuit; i++)
	{
		pbar.Message = $"Start {i + 1} of {ticks} {Console.CursorTop}/{Console.WindowHeight}: {initialMessage}";
		childAction?.Invoke(i);
		Thread.Sleep(sleep);
		pbar.Tick($"End {i + 1} of {ticks} {Console.CursorTop}/{Console.WindowHeight}: {initialMessage}");
	}
}

然後配置進度條配置參數,執行走進度。

const int totalTicks = 10;
var options = new ProgressBarOptions
{
	ProgressCharacter = '─',
	ProgressBarOnBottom = true
};
using (var pbar = new ProgressBar(totalTicks, "progress bar is on the bottom now", options))
{
	TickToCompletion(pbar, totalTicks, sleep: 500);
}
  • 執行效果截圖

ShellProgressBar的使用

3. 配置進度條的樣式

除了常規的進度條,還可以配置進度條的樣式。

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, "showing off styling", options))
{
	TickToCompletion(pbar, totalTicks, sleep: 500);
}
  • 執行效果截圖

配置進度條的樣式

4. 設置非實時刷新進度

默認進度條的刷新時間是500ms,我們可以設置不讓它實時刷新。

const int totalTicks = 5;
var options = new ProgressBarOptions
{
	// 關閉實時顯示時間
	DisplayTimeInRealTime = false
};
using (var pbar = new ProgressBar(totalTicks, "only draw progress on tick", options))
{
	TickToCompletion(pbar, totalTicks, sleep: 1750);
}
  • 執行效果截圖

設置非實時刷新進度

5. 嵌套子進度條

我們還可以嵌套子進度條,進度條下都可以嵌套屬於自己的子進度條。

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 = '─',
	// 當完成時保存子進度條狀態
	CollapseWhenFinished = false
};
// 執行嵌套進度
using (var pbar = new ProgressBar(totalTicks, "main progressbar", options))
{
	TickToCompletion(pbar, totalTicks, sleep: 10, childAction: (x) =>
	{
		using (var child = pbar.Spawn(totalTicks, "child actions", childOptions))
		{
			TickToCompletion(child, totalTicks, sleep: 100);
		}
	});
}
  • 執行效果截圖

嵌套子進度條

6. 項目地址鏈接

shellprogressbar https://github.com/Mpdreamz/shellprogressbar

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章