Maneira simples de imprimir a barra de progresso usando o console.
Existe uma interface IProgress pronta para operação:
Exemplo:
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);
}
Efeito:
Princípio:
A interface IProgress precisa implementar o método void Report(T value);.
Aqui está o valor do progresso
. Pode ser de diferentes tipos de dados. O mais comum é int, que é principalmente expresso como 1 ~ 100, e double é expresso principalmente como 0,01-1,00
fornecido por C#. Uma classe de implementação básica de IProgress,
Progress, pode ter um construtor parametrizado
public Progress (manipulador de ação);
o parâmetro deste método é uma ação sem valor de retorno (pode ser entendido como um método void), mas deve ser um parâmetro genérico T.
Sempre que Report for chamado, o método manipulador será executado automaticamente ,
e o parâmetro de tipo T deste manipulador é o Valor do Relatório.
Nota:
os threads de execução são diferentes, mas a ordem é síncrona, deve ser definida para execução assíncrona.
Assíncrono pode ser modificado da seguinte forma:
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("异步完成后才执行");