Saltar al pie de página
Iron Academy Logo
Aplicación C#
Aplicación C#

Otras categorías

Barras de progreso en tiempo real - Spectre Console Series

Tim Corey
7m 04s

El objetivo de la biblioteca Spectre.Console es convertir aplicaciones de consola ordinarias en C# en herramientas visualmente atractivas e informativas. Una de sus características más llamativas es la posibilidad de mostrar barras de progreso que se actualizan a medida que funciona la aplicación. Esto resulta extremadamente útil para tareas de larga duración en las que se desea mantener informado al usuario.

En su vídeo "Live Progress Bars - Spectre Console Series", Tim Corey muestra cómo crear una barra de progreso de Spectre Console en C# paso a paso.

Configuración de la aplicación de consola

Al principio del vídeo (0:00) Tim presenta la biblioteca de consola Spectre.Console y muestra que el enlace al código fuente está disponible debajo del vídeo. Recuerda a los espectadores que se trata de fragmentos de 10 minutos que pueden incorporar a su día a día.

Tim está trabajando en una aplicación de consola normal en C#: piense en un simple archivo boilerplate con la clase Program y el static void Main(string[] args). No utiliza ningún marco de interfaz de usuario especial, solo una referencia de paquete NuGet a Spectre.Console. Se trata de un buen recordatorio de que se pueden incorporar estas funciones a cualquier terminal de Windows o host de consola.

Creación del contexto de Progress

A las 0:34 Tim empieza a codificar. En su método Main, llama a AnsiConsole.Progress() y luego a .Start() sobre ella. Este es el punto de entrada estándar para una barra de progreso en Spectre.Console.

Muestra que pasas una lambda con un parámetro de contexto, que puedes considerar como ctx asíncrono cuando más tarde lo conviertas en asíncrono. Dentro de este contexto, usted define sus tareas. Este es el equivalente en Spectre.Console de configurar las tareas de progreso antes de empezar a actualizarlas.

Añadir tareas de progreso

Tim crea tres tareas de progreso:

  • "Descarga de datos

  • "Instalación de aplicaciones"

  • "Limpieza de datos

Cada una se añade con var task = context.AddTask("..."). Éstas devuelven asas de tareas que se pueden incrementar posteriormente. Tim señala (1:22) que sólo está arañando la superficie: Spectre.Console admite diferentes estilos, columnas y diseños, como añadir una nueva ProgressBarColumn, una nueva PercentageColumn, una nueva SpinnerColumn o una nueva TaskDescriptionColumn para personalizar el aspecto de la barra.

Compara las tareas con el instalador de Visual Studio: descargar, instalar y luego limpiar (1:42). Se podría imaginar que cada tarea contiene internamente un porcentaje int o un valor int a medida que se actualiza.

Actualización de las barras de progreso

En el minuto 1:50, Tim configura un bucle while para que se ejecute hasta que finalice el contexto. En un programa real de consola en C se puede escribir while (!context.IsFinished) o while (context.IsFinished == false) dentro del método Main.

Dentro del bucle, llama a Thread.Sleep(500) para ralentizar las cosas (2:15). A continuación, llama a task.Increment() con un doble aleatorio multiplicado por un valor máximo (2:29, 2:47). Esto simula el trabajo que se está realizando.

Actualiza la tarea uno y la tarea dos a diferentes velocidades, y para la tarea tres añade una comprobación if (3:05) para que sólo se inicie después de que el porcentaje de la tarea dos sea superior a 80. Esto es esencialmente controlar las dependencias entre las tareas. Esto es esencialmente controlar las dependencias entre las tareas de progreso.

Aunque Tim no escriba literalmente int i en un bucle foreach, puede imaginarse utilizar uno para iterar sobre tareas y llamar a .Increment(int) para cada una. En producción puede haber datos reales, como un cliente var descargando archivos, o una cadena de nombres de archivo siendo procesada. Tim lo mantiene sencillo con números aleatorios para mostrar la pantalla.

Visualización y observación de las barras de progreso

A las 3:47 Tim ejecuta la aplicación de consola. Las barras de progreso aparecen apiladas. Cada barra muestra un porcentaje al final, volviéndose verde cuando se completa (4:01). Una vez realizadas las primeras tareas, comienza la "limpieza de datos".

En el minuto 4:14, Tim señala que el cursor vuelve a la parte inferior de la consola, un pequeño pero importante detalle de usabilidad. La barra de progreso de Spectre.Console formatea automáticamente el estado y mantiene todo en su sitio sin parpadear.

Ser asíncrono con la tarea Await

A las 4:36 Tim cambia de marcha para mostrar una versión asíncrona. Cambia .Start() por .StartAsync() y marca la lambda async. Ahora el parámetro context se comporta como async ctx.

En el interior, en lugar de Thread.Sleep utiliza await Task.Delay(500) (4:58). Esto devuelve el control al sistema durante la espera. En un programa real podrías estar esperando una operación real, como await client.DownloadAsync() o await AnsiConsole.MarkupAsync() para imprimir texto de estado junto a la barra.

La versión asíncrona funciona exactamente igual visualmente (5:16-5:23), pero se adapta mejor a los flujos de trabajo asíncronos modernos. Tim no lo muestra, pero también podrías capturar excepciones con try/catch (Exception ex) alrededor de tus tareas esperadas.

Spectre Console Live Progress Bars 1 related to Ser asíncrono con la tarea Await

AutoClear y Acabado

Tim observa que, por defecto, Spectre.Console deja las tareas completadas en pantalla al 100%. Si quieres que desaparezcan automáticamente, llama a .AutoClear(true) después de configurar tu progreso (5:42). Una vez finalizado el trabajo, las barras desaparecen al instante (6:02).

Spectre Console Live Progress Bars 2 related to AutoClear y Acabado

Esto es útil cuando sólo se necesita mostrar un informe de progreso temporalmente y no se quiere saturar la salida de la consola. Combinado con avisos interactivos, nuevas pantallas de panel o incluso una tabla var de Spectre.Console, puede crear una interfaz de usuario de consola dinámica al estilo de un cuadro de mandos.

Más allá de lo básico - Diferentes estilos y columnas

En los últimos minutos, Tim menciona (6:11) que hay mucho más por explorar. Puedes cambiar el formato, los colores, el diseño y utilizar diferentes tipos de columnas. Por ejemplo, puede añadir un nuevo gráfico de barras, una nueva tabla o combinar un nuevo panel con barras de progreso para mostrar resultados agrupados.

La documentación de Spectre.Console muestra cómo mezclar nuevas implementaciones de ProgressColumn, o ajustar el valor máximo de cada tarea, o incluso plegar varias tareas en una sola barra para ahorrar espacio ("plegar espacio"). Podría utilizarlas para mostrar recuentos, números totales, nombres de archivo, nombres de usuario o contraseñas que se están procesando, todo ello con un formato agradable dentro de su aplicación de consola.

Conclusión

Tim, al final de su vídeo cubrió:

  • Una barra de progreso de Spectre Console construida desde cero

  • Cómo definir y actualizar múltiples tareas de progreso

  • Cómo ejecutarlo de forma síncrona con Thread.Sleep o de forma asíncrona con await Task.Delay

  • Cómo usar .AutoClear(true) para borrar barras terminadas

  • Dónde acudir para obtener un estilo y una documentación más avanzados

Esta pequeña demostración muestra lo fácil que es incorporar barras de progreso de aspecto profesional a cualquier programa de consola en C#. Utilizando sólo el paquete NuGet de Spectre.Console y unas pocas líneas de código, puede mostrar el estado, mostrar porcentajes, y dar a sus usuarios una visión mucho más clara de lo que su aplicación está haciendo.

Hero Worlddot related to Barras de progreso en tiempo real - Spectre Console Series
Hero Affiliate related to Barras de progreso en tiempo real - Spectre Console Series

Gana más compartiendo lo que te gusta

¿Creas contenidos para desarrolladores que trabajan con .NET, C#, Java, Python o Node.js? ¡Convierte tu experiencia en un ingreso extra!

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame