Mensagens de status ao vivo e indicadores de carregamento - Série de consoles Spectre
Spectre Console é uma poderosa biblioteca .NET que permite criar aplicativos de console elegantes sem sair do C#. Em sua série de vídeos, Tim Corey descreve cada uma de suas funcionalidades. Neste vídeo sobre " Mensagens de Status e Indicadores de Carregamento ao Vivo - Série Spectre Console ", Tim se concentra no Spectre Console Status, uma ferramenta para exibir mensagens de status ao vivo e indicadores de carregamento animados enquanto um aplicativo de console executa uma tarefa de longa duração.
Neste artigo, vamos analisar mais detalhadamente o recurso de status do Spectre Console, acompanhando as explicações de Tim. Você verá como Tim primeiro configura um indicador de carregamento simples, depois o personaliza e, finalmente, o utiliza em um exemplo assíncrono mais realista para baixar dados. Ao final da demonstração, você verá como o Spectre Console facilita o fornecimento de informações claras ao usuário sobre o que está acontecendo nos bastidores.
Começando com um exemplo de status mais simples (0:31)
Tim começa mostrando os exemplos mais simples de uma mensagem de status. Ele chama:
AnsiConsole.Status()
.Start("Carregando...", ctx =>
{
Thread.Sleep(3000);
});
Esta é a maneira mais simples de adicionar um indicador de status a um projeto de console. Ele explica que dentro das chaves, você pode executar qualquer comando ou código que leve tempo. Para a demonstração, Tim usa apenas um intervalo de três segundos para simular uma operação lenta.
Ao executar este aplicativo de console, você verá imediatamente a mensagem "Carregando..." na linha, juntamente com um indicador de carregamento padrão. Esta breve demonstração mostra como o Spectre Console pode transformar até mesmo um prompt simples em algo mais dinâmico.

Personalizando o Spinner – Tipos suportados (1:54)
Às 1:54, Tim passa para a personalização. O Spectre Console vem com uma longa lista de tipos de spinners integrados, e você pode alterá-los com:
ctx.Spinner = Spinner.Known.Aesthetic;
Ele percorre os tipos disponíveis e escolhe "Estético" para mostrar que o formato do seletor pode ser alterado facilmente. Esse tipo de pequena alteração já deixa seu aplicativo de console com uma aparência mais profissional.

Tim também destaca, aos 2:39, que nem todos os terminais são totalmente compatíveis com todos os tipos de indicadores de carregamento. Se você estiver executando o programa dentro do Visual Studio, poderá ver uma animação de fallback. Essa é a maneira que o Spectre Console encontra para lidar com erros de forma elegante: ele escolhe automaticamente um indicador de carregamento mais simples que seja adequado ao seu ambiente, para que o usuário ainda receba feedback.
Por que isso torna os aplicativos de console mais fáceis para o usuário (3:07)
Às 3h07, Tim faz uma pausa para explicar por que esse recurso é importante. Se o seu aplicativo estiver criando ou baixando arquivos, processando dados ou realizando qualquer tarefa demorada, uma mensagem de status com um indicador de carregamento "avisa o usuário de que algo está acontecendo". Sem ela, um console em branco pode parecer congelado.
Tim enfatiza que, quando a tarefa é concluída, o status desaparece, restando apenas as informações do resultado. Isso ajuda a manter seu aplicativo de console limpo e informativo ao mesmo tempo.
Migrando para Await AnsiConsole para trabalho assíncrono (3:24)
Até este ponto, Tim usou Start(). Mas em aplicativos reais, você provavelmente está aguardando operações. Às 3h34, ele muda para:
aguarde AnsiConsole.Status()
.StartAsync("Carregando...", async ctx =>
{
// trabalho assíncrono
});
Essa pequena alteração — usar await AnsiConsole e .StartAsync() — permite executar código assíncrono dentro do bloco de status. Tim alerta aos 4:02 que o contexto interno não é seguro para atualizações da interface do usuário em relação a múltiplas threads. Sempre "volte à thread da interface do usuário" para alterar o indicador de carregamento ou o texto de status. Essa verificação evita erros estranhos quando você tenta atualizar a partir de outra thread.
Baixando dados em loop – Uma demonstração mais realista (4:26)
Em seguida, Tim cria um loop para simular uma tarefa do mundo real: baixar 20 cursos de uma API. Ele reescreve o código para que fique assim:
para (int i = 1; i < 21; i++)
{
ctx.Status($"Baixar curso {i}...");
var jsonResponse = await Helpers.Fetch($"https://sample.com/courses/{i}");
AnsiConsole.MarkupLine($"[red]Curso {i} baixado[/]");
}
Aqui ele mostra três recursos importantes do Spectre Console funcionando em conjunto:
-
Context.Status() altera dinamicamente a string de status exibida ao lado do indicador de carregamento.
-
await Helpers.Fetch(...) representa uma tarefa assíncrona real dentro do seu aplicativo de console.
- AnsiConsole.MarkupLine() usa a linguagem de marcação do Spectre para adicionar cores. Tim escolhe [vermelho] apenas "para ter algo divertido para fazer".
Este exemplo mostra como é fácil adicionar feedback de progresso a um projeto sem usar código complexo.
Visualizando o aplicativo em execução (7:21)
Quando Tim executa o novo código, você vê um indicador verde (o tipo estético do tema dele) e o texto de status mudando para "Baixando curso 1…", "Baixando curso 2…", etc. À medida que cada download termina, uma linha vermelha aparece: "Curso 1 baixado", "Curso 2 baixado".

Tim observa que essa é uma ótima maneira de acompanhar tarefas como o envio de dados ou o processamento de arquivos. "Você deixa para trás as mensagens de resultado, mas não tem mais aquela mensagem de espera durante o download", explica ele às 7:27.

Síncrono vs. Assíncrono – Sem diferença de desempenho (8:00)
Às 8h, Tim aborda o tema da performance. Usar Start() em vez de StartAsync() não altera a velocidade da animação do spinner. O que importa é se o seu código interno é assíncrono. Se você estiver usando await, você precisa de .StartAsync(); Caso contrário, .Start() funciona bem.
Isso significa que você pode adicionar feedback de status ao seu aplicativo de console sem se preocupar em torná-lo mais lento. Ele simplesmente engloba qualquer trabalho que você já esteja fazendo.
Spinners integrados e personalizados – Uma longa lista para conferir (8:45)
Ao concluir, Tim destaca que o Spectre Console oferece "inúmeros" spinners integrados. Você pode percorrer a lista e escolher o que mais gostar — desde pontos e setas até opções "estéticas". Mais adiante na série, Tim mostrará como criar um spinner personalizado para que você possa combiná-lo totalmente com a identidade visual ou as cores do seu aplicativo.
Essa flexibilidade é parte do que torna o Spectre Console uma ótima ferramenta para criar aplicativos de console com visual incrível. Ele fornece feedback sobre o progresso, resultados imediatos e recursos visuais dinâmicos sem reinventar a roda.
Conclusão – Status do Console Spectre em ação (9:07)
Seguindo o vídeo de Tim Corey, vimos como usar o Spectre Console Status para aprimorar um aplicativo de console .NET :
-
Use AnsiConsole.Status().Start() ou aguarde AnsiConsole.Status().StartAsync() para exibir um indicador de carregamento e um texto de status enquanto uma tarefa é executada.
-
Atualize o context.Status() dinamicamente dentro do seu loop.
-
Exiba os resultados com AnsiConsole.MarkupLine() e marcação Spectre para vermelho, verde ou outras cores.
-
Escolha entre uma lista de seletores predefinidos ou crie o seu próprio mais tarde.
- Forneça informações claras ao usuário, mantendo a saída do console organizada.
Esses pequenos detalhes podem transformar um projeto de console comum em um aplicativo de console incrível. O recurso de status do Spectre Console facilita o compartilhamento do progresso, a verificação de resultados e torna as mensagens do seu aplicativo mais amigáveis e interativas.
