Mensajes de estado en directo y Spinners - Spectre Console Series
Spectre Console es una potente biblioteca .NET que permite crear hermosas aplicaciones de consola sin salir de C#. En su serie de vídeos, Tim Corey recorre sus características una a una. En este vídeo sobre "Mensajes de estado en directo y spinners - Spectre Console Series", Tim se centra en Spectre Console Status, una herramienta para mostrar mensajes de estado en directo y spinners animados mientras una aplicación de consola ejecuta una tarea de larga duración.
En este artículo, profundizaremos en la función de estado de Spectre Console siguiendo las explicaciones de Tim. Verás cómo Tim configura primero un sencillo spinner de carga, luego lo personaliza y, por último, lo utiliza en un ejemplo más realista y asíncrono para descargar datos. Al final de la demostración, verás cómo Spectre Console facilita al usuario información clara sobre lo que ocurre entre bastidores.
Empezando con un ejemplo de estado más sencillo (0:31)
Tim comienza mostrando los ejemplos más sencillos de un mensaje de estado. Pide:
AnsiConsole.Status()
.Start("Cargando...", ctx =>
{
Hilo.Sleep(3000);
});
Esta es la forma más sencilla de añadir un indicador de estado a un proyecto de consola. Explica que dentro de las llaves se puede ejecutar cualquier comando o ejecutar cualquier código que lleve tiempo. Para la demostración, Tim sólo utiliza una suspensión de tres segundos para simular una operación lenta.
Cuando se ejecuta esta aplicación de consola, se ve inmediatamente la cadena "Loading..." en la línea junto con un spinner predeterminado. Esta rápida demostración muestra cómo Spectre Console puede convertir incluso un simple mensaje en algo más dinámico.

Personalización del Spinner - Tipos admitidos (1:54)
En el minuto 1:54, Tim pasa a la personalización. Spectre Console viene con una larga lista de tipos de spinner incorporados, y puedes cambiarlos con:
ctx.Spinner = Spinner.Conocido.Estético;
Se desplaza por los tipos disponibles y elige "Estética" para mostrar que el formato del spinner se puede cambiar fácilmente. Este tipo de pequeño cambio ya hace que tu aplicación de consola parezca más pulida.

Tim también señala en el minuto 2:39 que no todos los terminales son totalmente compatibles con todos los spinners. Si se ejecuta dentro de Visual Studio, es posible que aparezca una animación. Esta es la forma en que Spectre Console maneja los errores con elegancia: elige automáticamente un spinner más simple que es verdadero para su entorno, de modo que el usuario sigue recibiendo retroalimentación.
Por qué esto hace que las aplicaciones de consola sean más fáciles para el usuario (3:07)
En el minuto 3:07, Tim hace una pausa para explicar por qué es importante esta característica. Si tu aplicación está creando o descargando archivos, procesando datos o haciendo cualquier cosa que consuma tiempo, un mensaje de estado con un spinner "permite al usuario saber que algo está pasando" Sin él, una consola en blanco podría parecer congelada.
Tim subraya que, una vez finalizada la tarea, el estado desaparece, dejando solo la información del resultado. Esto ayuda a mantener su aplicación de consola limpia e informativa al mismo tiempo.
Moviendo a Await AnsiConsole para Trabajo Asíncrono (3:24)
Hasta ahora, Tim ha utilizado Start(). Pero en las aplicaciones reales, probablemente estés esperando operaciones. A las 3:34, cambia a:
await AnsiConsole.Estado()
.StartAsync("Cargando...", async ctx =>
{
// trabajo asíncrono
});
Este pequeño cambio -utilizando await AnsiConsole y .StartAsync()- te permite ejecutar código asíncrono dentro del bloque de estado. Tim advierte en el minuto 4:02 que el contexto interno no es seguro para las actualizaciones de la interfaz de usuario. Siempre "vuelva al hilo de la interfaz de usuario" para cambiar el texto del spinner o del estado. Esta comprobación evita errores extraños cuando se intenta actualizar desde otro hilo.
Descarga de datos en bucle: una demostración más realista (4:26)
A continuación, Tim crea un bucle para simular una tarea del mundo real: descargar 20 cursos de una API. Reescribe el código para que tenga este aspecto:
para (int i = 1; yo < 21; yo++)
{
ctx.Status($"Descargar curso {i}...");
var jsonResponse = await Helpers.Fetch($"https://sample.com/courses/{i}");
AnsiConsole.MarkupLine($"[red]Curso {i} descargado[/]");
}
Aquí muestra tres importantes características de Spectre Console trabajando juntas:
-
Context.Status() cambia dinámicamente la cadena de estado que se muestra junto al spinner.
-
await Helpers.Fetch(...) representa una tarea asíncrona real dentro de su aplicación de consola.
- AnsiConsole.MarkupLine() utiliza el marcado de Spectre para añadir colores. Tim elige [red] solo "para tener algo divertido que hacer"
Este ejemplo muestra lo fácil que es añadir comentarios sobre el progreso de un proyecto sin necesidad de código complejo.
Visualización de la aplicación en ejecución (7:21)
Cuando Tim ejecuta el nuevo código, ve un spinner verde (del tipo Estética en su tema) y el texto de estado cambiando a "Descargando curso 1...", "Descargando curso 2...", etc. Cuando finaliza cada descarga, aparece una línea roja: "Curso 1 descargado", "Curso 2 descargado"

Tim señala que es una forma estupenda de realizar un seguimiento de tareas como la carga de datos o el procesamiento de archivos. "Dejas atrás los mensajes de resultados, pero ya no tienes ese mensaje de espera con la descarga", explica en el minuto 7:27.

Síncrono frente a asíncrono: no hay diferencia de rendimiento (8:00)
A las 8:00 Tim aborda el rendimiento. El uso de Start() frente a StartAsync() no cambia la velocidad de animación del spinner. Sólo importa si el código que contiene es asíncrono. Si usas await, necesitas .StartAsync(); de lo contrario, .Start() está bien.
Esto significa que puede añadir información de estado a su aplicación de consola sin preocuparse por ralentizarla. Simplemente envuelve el trabajo que ya estás haciendo.
Giradores integrados y personalizados: una larga lista que hay que comprobar (8:45)
Para terminar, Tim destaca que Spectre Console ofrece "toneladas" de spinners integrados. Puedes desplazarte por la lista y elegir la que más te guste: desde puntos hasta flechas, pasando por "estética" Más adelante en la serie, Tim mostrará cómo crear un spinner personalizado para que puedas adaptarlo totalmente a la marca o los colores de tu aplicación.
Esta flexibilidad es parte de lo que hace que Spectre Console sea una gran herramienta para crear hermosas aplicaciones de consola. Ofrece información sobre el progreso, resultados rápidos y efectos visuales dinámicos sin reinventar la rueda.
Conclusión - Estado de la consola Spectre en acción (9:07)
Siguiendo el vídeo de Tim Corey, hemos visto cómo utilizar Spectre Console Status para mejorar una aplicación de consola .NET:
-
Utilice AnsiConsole.Status().Start() o await AnsiConsole.Estado().StartAsync() para mostrar un spinner y un texto de estado mientras se ejecuta una tarea.
-
Actualiza el context.Status() dinámicamente dentro de tu bucle.
-
Resultados de salida con AnsiConsole.MarkupLine() y marcado Spectre para rojo, verde u otros colores.
-
Elija entre una lista integrada de spinners o cree el suyo propio más adelante.
- Hay que proporcionar información clara al usuario y mantener limpia la salida de la consola.
Estos pequeños toques pueden convertir un proyecto de consola ordinario en una aplicación de consola hermosa. La función de estado de Spectre Console hace que sea más sencillo compartir el progreso, comprobar los resultados y hacer que el aviso de tu aplicación sea más amigable e interactivo.
