Crear una barra de progreso en C#

Syed Hassan Sabeeh Kazmi 12 octubre 2023
  1. Crear una barra de progreso en la aplicación Windows Forms (.NET Framework)
  2. Crear una barra de progreso usando la clase BackgroundWorker en C#
  3. Crear una Barra de Progreso con Texto en C#
Crear una barra de progreso en C#

Los cálculos y las operaciones de archivos extensos requieren indicaciones de progreso, y una barra de progreso es la mejor manera de mostrar la información de progreso al usuario durante una operación de larga duración. Este tutorial le enseñará cómo crear tres barras de progreso diferentes en C# usando Visual Studio 2022.

Una barra de progreso dinámica en C# presenta dos propiedades para especificar su rango (propiedades Máximo y Mínimo), principalmente equivalentes a la cantidad de archivos para copiar o procesos para ejecutar. Además, cuando se completa un proceso y para realizar incrementos en el valor de la barra de progreso, se utiliza la propiedad Step con el método PerformStep.

Una barra de progreso prediseñada en C# solo se puede orientar horizontalmente; sin embargo, puede crear una barra de progreso personalizada que se adapte a sus necesidades. El propósito principal de una barra de progreso es alertar al usuario sobre el progreso de las tareas que realiza actualmente una aplicación de C#.

Crear una barra de progreso en la aplicación Windows Forms (.NET Framework)

Una barra de progreso actúa como un elemento de interfaz de usuario que indica el progreso de una operación. Una barra de progreso en C# admite dos modos que representan el progreso: indeterminado y continuo.

El modo indeterminado de la barra de progreso es útil cuando realiza una tarea u operación que no sabe cuánto tiempo llevará. Se realiza cargando datos de forma asíncrona en un subproceso en segundo plano (generalmente con la ayuda de la clase BackgroundWorker) mientras la aplicación C# sigue respondiendo al usuario.

Es un paradigma de diseño común mostrar una barra de progreso indeterminada a medida que se cargan los datos y se establece hasta que comienza el progreso real. Al crear una barra de progreso en WinForms, es importante establecer la propiedad Estilo de la barra de progreso en Marquesina.

Sin embargo, una barra de progreso en WPM tiene la propiedad Isdeterminate que es similar a Style, y su valor como True funciona de manera similar a Marquee.

// namespaces for C# windows application (.NET Framework)

using System;
using System.Windows.Forms;

namespace ProgressBarExp {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    // create a `progressBar1` progress bar in your C# project design
    private void progressBar1_Click(object sender, EventArgs e) {}

    // create a method that performs some calculations
    // the progress bar will synch with this method and progress accordingly
    private void Caluculate(int i) {
      // perform a task
    }

    // create a `RunOperation` button to perform calculations or take action in your C# project
    // design
    private void RunOperation_Click(object sender, EventArgs e) {
      // set the visibility of progress bar
      progressBar1.Visible = true;

      for (int j = 0; j < 10000001; j++) {
        Caluculate(j);
        if (j == 10000000) {
          MessageBox.Show("Operation Complete!");
          progressBar1.Visible = false;
        }
      }
    }
    private void Form1_Load(object sender, EventArgs e) {
      // for indeterminate progress using .NET framework
      progressBar1.Style = ProgressBarStyle.Marquee;

      progressBar1.Visible = false;
    }
  }
}

Producción:

Barra de progreso de C# en Windows Forms - Salida 1

Una barra de progreso solo cumple su propósito correctamente cuando informa el progreso a medida que se cargan los datos. En las aplicaciones de C#, las barras de progreso son populares para instalar software, realizar tareas largas e iniciar, por lo que los usuarios saben exactamente cuánto tiempo llevará un proceso y cuánto progreso queda.

Para crear una barra de progreso continua en C#, elimine el código del evento RunOperation_Click y reemplácelo con el siguiente código:

private void RunOperation_Click(object sender, EventArgs e) {
  progressBar1.Visible = true;
  progressBar1.Maximum = 10000000;
  progressBar1.Value = 1;

  for (int j = 0; j < 10000001; j++) {
    Caluculate(j);

    if (progressBar1.Value == 10000000) {
      MessageBox.Show("Operation Complete!");
      progressBar1.Visible = false;
      break;
    }

    // it will measure the progress of the task or operations and progress in regards to the
    // completion of a task It only requires if the progress bar style is not set to Marquee
    progressBar1.PerformStep();
  }
}

Producción:

Barra de progreso de C# en Windows Forms - Salida 2

En el evento Form1_Load, comenta el progressBar1.Style = ProgressBarStyle.Marquee; línea del código C#, y tendrá una barra de progreso continua según el porcentaje de finalización de la tarea %.

Crear una barra de progreso usando la clase BackgroundWorker en C#

Debe quedar claro lo sencillo que es usar una barra de progreso en las aplicaciones de C#. Ahora es el momento de estudiar cómo avanza una barra de progreso al sincronizarla con algún trabajo real y no solo con un valor estático.

Donde la mayoría de los nuevos desarrolladores de C# tienen problemas es cuando se dan cuenta de que no pueden realizar una tarea y actualizar una barra de progreso, al mismo tiempo, en el mismo subproceso. Si está realizando una tarea pesada en el subproceso de la interfaz de usuario de una aplicación C# e intenta actualizar la barra de progreso en consecuencia, necesita los servicios de una clase BackgroundWorker en C#.

Sin la ayuda de la clase BackgroundWorker, que prácticamente hace que una barra de progreso sea inútil. La barra de progreso no mostrará ninguna actualización del progreso antes de que una tarea se complete con éxito y requiere un trabajador en segundo plano para actualizar ambos en un solo hilo simultáneamente.

Es una forma ideal de crear una barra de progreso con un fondo que funcione en C# para realizar una tarea en un subproceso de trabajo y luego enviar la actualización al subproceso de la interfaz de usuario, que actualizará instantáneamente la barra de progreso y mostrará estas actualizaciones.

using System;
using System.Windows;
using System.Threading;
using System.Windows.Forms;
using System.ComponentModel;

namespace ProgressBarExp {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    // create a progress bar in your C# project's Form1.cs [Design]
    private void progressBar1_Click(object sender, EventArgs e) {}

    // a button to perform an operation synched with the `progressBar1`
    private void RunOperation_Click(object sender, EventArgs e) {
      BackgroundWorker taskSynch = new BackgroundWorker();
      taskSynch.WorkerReportsProgress = true;
      taskSynch.DoWork += taskSynch_DoWork;
      taskSynch.ProgressChanged += taskSynch_ProgressChanged;
      taskSynch.RunWorkerAsync();
    }

    // Form1 load event
    private void Form1_Load(object sender, EventArgs e) {}

    // create a method that connects `BackgroundWorker` with a task
    void taskSynch_DoWork(object sender, DoWorkEventArgs e) {
      for (int i = 0; i < 100; i++) {
        (sender as BackgroundWorker).ReportProgress(i);
        Thread.Sleep(100);
      }
    }

    // create a method that connects a task with the `progressBar1`
    void taskSynch_ProgressChanged(object sender, ProgressChangedEventArgs e) {
      progressBar1.Value = e.ProgressPercentage;
    }
  }
}

Producción:

Barra de progreso de C# usando BackgroundWorker - Salida

Crear una Barra de Progreso con Texto en C#

En general, puede crear una barra de progreso personalizada que le brinde más control sobre su configuración. Sin embargo, escribir un código C# desde cero para crear una barra de progreso es un trabajo largo; puede usar paquetes NuGet como Syncfusion UI Control o ShellProgressBar para obtener barras de progreso listas para usar con diseños increíbles.

La forma más sencilla de crear una barra de progreso con texto es usar etiquetas y cambiar su texto de acuerdo con la progresión de una tarea. Puede sincronizar su progresión con la progresión de una tarea.

using System;
using System.Threading;
using System.Windows.Forms;
using System.ComponentModel;
using System.Drawing;

namespace ProgressBarExp {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    private void RunOperation_Click(object sender, EventArgs e) {
      BackgroundWorker taskSynch = new BackgroundWorker();
      taskSynch.WorkerReportsProgress = true;
      taskSynch.DoWork += taskSynch_DoWork;
      taskSynch.ProgressChanged += taskSynch_ProgressChanged;
      taskSynch.RunWorkerAsync();
    }

    private void Form1_Load(object sender, EventArgs e) {
      // make the percentage label `backcolor` transparent
      label1.BackColor = Color.Transparent;
    }

    void taskSynch_DoWork(object sender, DoWorkEventArgs e) {
      for (int i = 0; i < 101; i++) {
        (sender as BackgroundWorker).ReportProgress(i);
        Thread.Sleep(100);

        // to support multi-threading for label1 and label 2
        if (label1.InvokeRequired) {
          label1.Invoke(new MethodInvoker(delegate {
            // shows the progression, it is syched with the task progression
            label1.Text = "Progress: " + i + "%";
          }));
        }

        if (label2.InvokeRequired) {
          label2.Invoke(new MethodInvoker(delegate {
            if (i < 25) {
              label2.Text = "Starting the task...";
            } else if (i > 25 && i < 50) {
              label2.Text = "Half way through...";
            } else if (i > 50 && i < 99) {
              label2.Text = "The wait will be over soon...";
            } else if (i == 100) {
              label2.Text = "Task is completed successfully!";
            }
          }));
        }
      }
    }

    void taskSynch_ProgressChanged(object sender, ProgressChangedEventArgs e) {
      // it will update the progress bar in real time depends on the progress of a task
      progressBar1.Value = e.ProgressPercentage;
    }
  }
}

Producción:

Barra de progreso de C# con texto - Salida

Debe crear una barra de progreso progressBar1, un botón Ejecutar operación y etiquetas label1 y label2 en Form1 [Diseño] de su proyecto C# antes de ejecutar este código C#.

En este tutorial, aprendió cómo crear diferentes tipos de barras de progreso y sincronizarlas con la progresión real de una tarea usando la clase BackgroundWorker en C#.

Syed Hassan Sabeeh Kazmi avatar Syed Hassan Sabeeh Kazmi avatar

Hassan is a Software Engineer with a well-developed set of programming skills. He uses his knowledge and writing capabilities to produce interesting-to-read technical articles.

GitHub

Artículo relacionado - Csharp WinForms