Barras de progresso em tempo real - Série de consoles Spectre
A biblioteca Spectre.Console tem como objetivo transformar aplicativos de console C# comuns em ferramentas visualmente atraentes e informativas. Uma de suas características mais marcantes é a capacidade de exibir barras de progresso que são atualizadas conforme o aplicativo funciona. Isso é extremamente útil para tarefas de longa duração, nas quais você deseja manter o usuário informado.
Em seu vídeo " Barras de Progresso ao Vivo – Série Console Spectre ", Tim Corey mostra como criar uma barra de progresso do Console Spectre em C# passo a passo.
Configurando o aplicativo de console
No início do vídeo (0:00), Tim apresenta a biblioteca de console Spectre.Console e mostra que o link para o código-fonte está disponível abaixo do vídeo. Ele lembra aos espectadores que esses são blocos de 10 minutos que podem ser encaixados em seu dia.
Tim está trabalhando em um aplicativo de console C# normal — pense em um arquivo boilerplate simples com a classe Program e static void Main(string[] args). Ele não está usando nenhuma estrutura de interface de usuário especial, apenas uma referência ao pacote NuGet Spectre.Console. Isso serve como um bom lembrete de que você pode incorporar esses recursos em qualquer Terminal do Windows ou host de console.
Criando o Contexto de Progresso
Às 0:34, Tim começa a programar. Em seu método Main, ele chama AnsiConsole.Progress() e então .Start() nele. Este é o ponto de entrada padrão para uma barra de progresso no Spectre.Console.
Ele mostra que você passa uma função lambda com um parâmetro de contexto, que você pode considerar como um contexto assíncrono quando posteriormente o tornar assíncrono. Nesse contexto, você define suas tarefas. Isso é o equivalente no Spectre.Console a configurar suas tarefas de progresso antes de começar a atualizá-las.
Adicionando tarefas de progresso
Tim cria três tarefas de acompanhamento:
-
"Download de dados"
-
"Instalando o aplicativo"
- "Limpeza de dados"
Cada um é adicionado com var task = context.AddTask("…"). Esses identificadores de tarefas de retorno podem ser incrementados posteriormente. Tim observa (1:22) que ele está apenas arranhando a superfície — Spectre.Console suporta diferentes estilos, colunas e layouts, como adicionar uma nova ProgressBarColumn, uma nova PercentageColumn, uma nova SpinnerColumn ou uma nova TaskDescriptionColumn para personalizar a aparência da sua barra.
Ele compara as tarefas ao instalador do Visual Studio: baixar, instalar e depois limpar (1:42). Você pode imaginar cada tarefa armazenando internamente uma porcentagem inteira ou um valor inteiro à medida que você a atualiza.
Atualizando as barras de progresso
Às 1:50, Tim configura um loop while para ser executado até que o contexto seja finalizado. Em um programa de console C real, você poderia escrever while (!context.IsFinished) ou while (context.IsFinished == false) dentro do seu método Main.
Dentro do loop, ele chama Thread.Sleep(500) para diminuir a velocidade (2:15). Ele então chama task.Increment() com um número aleatório de ponto flutuante multiplicado por um valor máximo (2:29, 2:47). Isso simula a realização de trabalho.
Ele atualiza a tarefa um e a tarefa dois em velocidades diferentes e, para a tarefa três, adiciona uma verificação condicional (3:05) para que ela só comece depois que a porcentagem da tarefa dois for maior que 80%. Isso essencialmente controla as dependências entre as tarefas de progresso.
Embora Tim não digite literalmente int i em um loop foreach, você pode imaginar usar um para iterar sobre tarefas e chamar .Increment(int) para cada uma. Em produção, você pode ter dados reais, como um cliente de variável baixando arquivos ou um nome de arquivo em formato de string sendo processado. Tim simplifica tudo usando números aleatórios para exibir a mensagem.
Exibindo e observando as barras de progresso
Às 3h47, Tim executa o aplicativo de console. As barras de progresso aparecem empilhadas. Cada barra mostra uma porcentagem no final, ficando verde quando estiver completa (4:01). Assim que as primeiras tarefas forem concluídas, inicia-se a "Limpeza de Dados".
Às 4:14, Tim destaca que o cursor retorna à parte inferior do console, um detalhe pequeno, mas importante, de usabilidade. A barra de progresso do Spectre.Console formata automaticamente o status e mantém tudo no lugar, sem oscilações.
Tornando-se assíncrono com Await Task
Às 4:36, Tim muda o foco para mostrar uma versão assíncrona. Ele altera .Start() para .StartAsync() e marca a lambda como assíncrona. Agora o parâmetro de contexto se comporta como um ctx assíncrono.
Dentro, em vez de Thread.Sleep ele usa await Task.Delay(500) (4:58). Isso devolve o controle ao sistema enquanto se aguarda. Em um programa real, você pode estar aguardando uma operação real, como await client.DownloadAsync() ou await AnsiConsole.MarkupAsync() para imprimir o texto de status ao lado da barra.
A versão assíncrona funciona exatamente da mesma forma visualmente (5:16–5:23), mas é mais adequada para fluxos de trabalho assíncronos modernos. Tim não mostra isso, mas você também pode capturar exceções com try/catch (Exception ex) em torno de suas tarefas aguardadas.

Limpeza automática e finalização
Tim percebe que, por padrão, o Spectre.Console deixa as tarefas concluídas na tela em 100%. Se você quiser que eles desapareçam automaticamente, chame .AutoClear(true) depois de configurar seu progresso (5:42). Assim que o trabalho termina, as barras desaparecem instantaneamente (6:02).

Isso é útil quando você precisa exibir um relatório de progresso temporariamente e não quer sobrecarregar a saída do console. Combinando prompts interativos, novos painéis de exibição ou até mesmo uma tabela de variáveis do Spectre.Console, você pode criar uma interface de usuário de console dinâmica no estilo de um painel de controle.
Além do básico – Estilos e colunas diferentes
Nos minutos finais, Tim menciona (6:11) que há muito mais para explorar. Você pode alterar o formato, as cores, os layouts e usar diferentes tipos de coluna. Por exemplo, você pode adicionar um novo gráfico de barras, uma nova tabela ou combinar um novo painel com barras de progresso para exibir resultados agrupados.
A documentação do Spectre.Console mostra como integrar novas implementações de ProgressColumn, ajustar o valor máximo de cada tarefa ou até mesmo agrupar várias tarefas em uma única barra para economizar espaço ("otimização de espaço"). Você pode usar esses elementos para exibir contagens, números totais, nomes de arquivos, nomes de usuário ou senhas sendo processados — tudo formatado de forma organizada dentro do seu aplicativo de console.
Conclusão
Tim, ao final de seu vídeo, abordou os seguintes tópicos:
-
Uma barra de progresso do Spectre Console criada do zero
-
Como definir e atualizar várias tarefas de progresso
-
Como executar de forma síncrona com Thread.Sleep ou assíncrona com await Task.Delay
-
Como usar .AutoClear(true) para limpar as barras finalizadas
- Onde encontrar informações mais avançadas sobre estilo e documentação
Esta pequena demonstração mostra como é fácil adicionar barras de progresso com aparência profissional a qualquer programa de console em C#. Utilizando apenas o pacote NuGet do Spectre.Console e algumas linhas de código, você pode exibir o status, mostrar porcentagens e dar aos seus usuários uma visão muito mais clara do que seu aplicativo está fazendo.
