C# imprime barra de progresso no console [síncrono e assíncrono]

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:
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui
Insira a descrição da imagem aqui

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.

Adicione a descrição da imagem
Adicione a descrição da imagem
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("异步完成后才执行");

Acho que você gosta

Origin blog.csdn.net/jamenu/article/details/128532275
Recomendado
Clasificación