使用控制台打印进度条的简单方法。
有现成的IProgress接口进行操作:
实例:
var prog = new Progress<double>((theV => {
Console.WriteLine($@"Now the Progress:"
+ COUNT / 10.0 * 100 + "%" + new string('#', COUNT));
COUNT++;
Console.SetCursorPosition(0, 0);
}));
for(int i = 0; i < 10; i++)
{
Thread.Sleep(200);
((IProgress<double>)prog).Report(i / 10.0);
}
效果:
原理:
IProgress接口需要实现void Report(T value);方法
这里的T就是进度的值
可以不同的数据类型,最常见的比如int,则多表示为1~100,double多表示为0.01-1.00
C#提供一个IProgress的基本实现类
Progress它可有一个有参的构造方法
public Progress(Action handler);
这个方法的参数是一个无返回值的action(可以理解为一个void method),但必须要一个T泛型的参数。
每当调用Report时,就会自动的执行handler方法
而这个handler的T类型参数就是Report的Value
注意点:
执行的线程是不同的,但是顺序是同步的,则应该可以设置为异步执行
异步则可以如下改造:
Task<string> task = new Task<string>(()=> {
string tag = $@"|/-\"; int tag_index = 0;
int COUNT = 0;
var prog = new Progress<double>((theV => {
Console.Out.WriteLineAsync($@" args:{theV}|{tag[tag_index++ % tag.Length]}|ThreadID:{Thread.CurrentThread.ManagedThreadId}Now Progress is"
+ COUNT / 10.0 * 100 + "%" + new string('#', COUNT));
COUNT++;
Console.SetCursorPosition(0, 0);
}));
for (int i = 0; i < 10; i++)
{
Thread.Sleep(200);
((IProgress<double>)prog).Report(i / 10.0);
}
return "success";
});
task.Start();
Console.WriteLine("在这之前的会执行-----");
await task;
Console.WriteLine("异步完成后才执行");