none
Cómo hacer funcionar una barra de proceso con una clase. RRS feed

  • Pregunta

  • Buenas tardes y saludo a toda la comunidad, esta es la primera vez que escribo por aquí. Así que voy a intentar explicarme lo mejor posible.

    Estoy realizando una pequeña aplicación, que recorre un archivo seleccionado y lo comprueba con otro. Para esta tarea he creado una clase llamada ClsCheck. Hasta aquí todo bien, pero hay archivos que son pequeños 25 o 30 MB y no pasa nada lo hace bien. El problema viene con archivos de mayor tamaño como puede ser de 2 GB a 4 GB o más. Tarda mucho y parece que se queda pillado.

    He pensado ponerle una barra de progreso en vez de que se quede bloqueado el formulario mientras realiza las operaciones.

    He estado mirando como utilizar ProgressBar conjuntamente con BackgroundWorker, para realizar esta tarea. Todos los ejemplos que he visto lo realiza a través de un bucle, el cual repite la misma tarea x veces simulando que tarda mucho. Pero mi caso es que solo se ejecute una vez. Pongo el código de ejemplo:

            // Creo un procedimiento que me devuelve un mensaje de la clase
    	// que ejecuto para comparar los dos archivos.
    	private string ComparacionArchivo()
            {
                RutaArchivo = TxtArchivo.Text;			
                ClsCheck c = new ClsCheck();
                return c.ObtienesRresultado(RutaArchivo, RutaEstatica);
            }
    	// Este procedimiento lo lanzo cada vez que le doy al boton ejecutar.
    	private void RealizaComparacion()
            {
    	   TxtResultado.Text = "";
    	   // Realizo las comprobacion de archivo y BackgroundWorker.
    	   // Si todo está bien lo ejecuto.
                if (File.Exists(TxtArchivo.Text))
                {
                    if (ColaTrabajo.IsBusy != true)
                    {                    
                        ColaTrabajo.RunWorkerAsync();
    
                    }
                }
    
            }
    	// Este codigo es lo más habitual que hay para los ejemplos para hacer funcionar una barra.
    	// Lanza el proceso dentro de un bucle con el contador
    	// para actualizar la barra de progreso
    	private void ColaTrabajo_DoWork(object sender, DoWorkEventArgs e)
            {
                for (int contador = 1; contador <= 100; contador++)
                {
                    Resultado = ComparacionArchivo();
                    ColaTrabajo.ReportProgress(contador);
                }
    
            }
    	// Actualiza la barra de progreso en cada evento.
            private void ColaTrabajo_ProgressChanged(object sender, ProgressChangedEventArgs e)
            {
                BarraProgreso.Value = e.ProgressPercentage;
    
            }
    	// Una vez terminado muestra el mensaje en la caja de texto.
            private void ColaTrabajo_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                TxtResultado.Text = Resultado;
    
            }

    El código funciona "bien", muestra su barra de progreso y demás... pero está mal diseñado:

    for (int contador = 1; contador <= 100; contador++)
    {
       Resultado = ComparacionArchivo();
       ColaTrabajo.ReportProgress(contador);
    }

    Ejecuta ComparaciónArchivo(), 100 veces y claro.... se dispara el tiempo. Alguien me podría echar un cable con esto por favor, algún ejemplo o algún how to que especifique mejor como hacer esto?. Gracias de antemano.

    miércoles, 20 de enero de 2021 19:34

Respuestas

  • Hola,

    Gracias por levantar tu consulta en los foros de MSDN. Te dejo documentación oficial del uso del progress bar https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.progressbar?view=net-5.0

    Eric Ruiz

    ____________________________

    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    Si tiene algún cumplido o reclamo sobre el soporte de MSDN siéntase en la libertad de contactar MSDNFSF@microsoft.com.


    miércoles, 20 de enero de 2021 21:43
    Moderador