在C#控制台程序中实现进度条和动态字符百分比刷新,核心是通过控制台的光标定位、字符输出和清屏操作来实现视觉效果,不需要复杂的第三方依赖,原生API就能完成相关功能。

基础实现原理
控制台进度条的实现主要依赖三个核心操作:
- 使用
Console.CursorLeft和Console.CursorTop控制光标位置,避免每次输出都换行 - 通过循环模拟任务进度,计算当前进度百分比
- 用字符拼接或者覆盖输出的方式刷新进度显示内容
方案一:简易字符进度条
这种方案通过方括号包裹的井号字符表示进度,适合对显示效果要求不高的场景,代码逻辑非常简单。
using System;
using System.Threading;
namespace ConsoleProgressDemo
{
class Program
{
static void Main(string[] args)
{
int totalSteps = 50; // 总进度步数
Console.Write("任务进度: [");
for (int i = 0; i <= totalSteps; i++)
{
// 计算当前百分比
double percent = (double)i / totalSteps * 100;
// 输出进度条字符
Console.Write("#");
// 光标回到进度条开始位置,准备刷新百分比
Console.CursorLeft = Console.CursorLeft + 8;
// 输出当前百分比,固定格式避免光标偏移
Console.Write($"{percent:F1}%");
// 模拟任务耗时
Thread.Sleep(100);
// 光标回到进度条末尾,继续输出下一个字符
Console.CursorLeft = 11 + i + 1;
}
Console.WriteLine("n任务执行完成");
}
}
}
方案二:动态刷新完整进度条
这种方案可以完整显示进度条、当前百分比和任务状态,支持动态刷新整个进度行,显示效果更规范。
using System;
using System.Threading;
namespace ConsoleProgressDemo
{
class Program
{
static void Main(string[] args)
{
int totalCount = 100; // 总任务量
for (int current = 0; current <= totalCount; current++)
{
// 计算进度百分比
double percent = (double)current / totalCount * 100;
// 计算进度条填充长度,假设进度条总长度为30个字符
int barLength = 30;
int filledLength = (int)(barLength * current / totalCount);
// 拼接进度条字符串
string progressBar = "[" + new string('#', filledLength) + new string(' ', barLength - filledLength) + "]";
// 拼接完整显示内容
string display = $"任务处理中 {progressBar} {percent:F2}% ({current}/{totalCount})";
// 输出内容,使用r回到行首覆盖之前的内容
Console.Write($"r{display}");
// 模拟任务耗时
Thread.Sleep(80);
}
// 换行输出完成提示
Console.WriteLine("nn所有任务处理完毕");
}
}
}
注意事项
- 使用
r回到行首刷新时,新的输出内容长度不能小于之前的内容,否则会残留之前的字符,建议用空格补齐或者固定显示长度 - 如果控制台输出内容较多,需要避免其他输出干扰进度条的行,最好单独占用一行显示进度
- 多线程场景下刷新进度条需要做线程同步,避免多个线程同时修改光标位置导致显示混乱
- 百分比计算时注意整数除法的陷阱,需要先将其中一个操作数转为double类型再计算
以上两种方案都是控制台进度条的基础实现,实际项目中可以根据需求扩展,比如添加剩余时间预估、任务状态提示等功能,核心逻辑都是基于光标控制和内容覆盖刷新。