Red de conocimiento de recetas - Se unen a la olla caliente - Cómo mostrar una barra de progreso

Cómo mostrar una barra de progreso

Recientemente estoy trabajando en una herramienta de análisis de registros VSS, que se desarrolló en C#. Una vez completadas todas las funciones, descubrí que descargar registros VSS desde el servidor consumía mucho tiempo, lo que resultaba en una mala experiencia para el usuario, por lo que planeé agregar una barra de progreso.

Dado que C# no se usa mucho, parece difícil hacer una barra de progreso a la vez. También se están realizando otras tareas de desarrollo al mismo tiempo, por lo que ayer no hubo mucho progreso.

Hoy es fin de semana y resulta que estoy libre. Después de consultar mucha información y ejemplos en línea, hice varios ejemplos para uso futuro.

Usar C# para mostrar una barra de progreso implica programación multiproceso. Solo he explorado métodos usando BackgroundWorker y Thread, que se enumeran a continuación.

El primero: Utiliza BackgroundWorker para controlar la barra de progreso.

El objeto BackgroundWorker tiene tres eventos principales:

DoWork: se activa al realizar operaciones multiproceso en el objeto BackgroundWorker.

RunWokerCompleted: se activa cuando se completa la operación multiproceso del objeto BackgroundWoker.

El progreso cambia: se activa cuando cambia el estado de operación multiproceso del objeto BackgroundWorker.

WorkerReportsProgress: si desea que el objeto BackgroundWorker informe de forma asíncrona el progreso en tiempo real del hilo, debe establecer el valor de esta propiedad en verdadero.

El método ReportProgress del objeto BackgroundWorker se utiliza para devolver el progreso en tiempo real de la ejecución del subproceso en segundo plano al subproceso principal.

Código de muestra 1, controla la visualización de la barra de progreso en el formulario principal.

¿[csharp]? Ver texto sin formato

¿Público? ¿parte? ¿clase? ¿Forma1? :?Formulario

{

///?& ltResumen& gt

///?Hilo de fondo

/// ?< /summary>

¿Privado? ¿Trabajador de fondo? bkTrabajador? =?¿Nuevo? trabajador en segundo plano();

///?& ltSummary& gt

///?Valor del paso

///?& lt/summary >

¿Privado? int? ¿Valor porcentual? =?0;

¿Privado? Formulario 1()

{

inicializar componente();

bkWorker. ¿Progreso de informes de trabajadores? =?Verdadero;

bkWorker. ¿Los trabajadores apoyan la cancelación? =?Verdadero;

bkWorker. ¿Doc? +=?¿Nuevo? DoWorkEventHandler(DoWork);

bkWorker. ¿Progreso cambiado? +=?¿Nuevo? ProgressChangedEventHandler(progreso cambiado);

bkWorker. ¿EjecutarWorker completado? +=?¿Nuevo? RunWorkerCompletedEventHandler(CompleteWork);

}

¿Privado? ¿Vacío? btnStart_Click(¿Objeto? ¿Remitente? ¿EventArgs? e)

{

¿Valor porcentual? =?10;

this.progressBar1. ¿máximo? =?1000;

//?Realizar operaciones en segundo plano

bkWorker.

RunWorkerAsync();

}

¿Público? ¿Vacío? DoWork(¿Objeto? ¿Remitente? DoWorkEventArgs? e)

{

//?Procesamiento de eventos, especifique la función de procesamiento

¿Resultado? =?ProcessProgress(bkWorker, e);

}

¿Público? ¿Vacío? ProgressChanged(¿Objeto? ¿Remitente? ProgressChangedEventArgs? e)

{

//?bkWorker. ¿Informar progreso? Se llamará aquí y puede personalizar el método de informe aquí.

esta.progressBar1. ¿valor? =?e.Porcentaje de progreso;

int? ¿porcentaje? =?(int)(e.ProgressPercentage?/?Valor porcentual);

this.label1. ¿Palabra? =?"Progreso del procesamiento:"? +?Convertir. ¿ToString (porcentaje)? +?"%";

}

¿Público? ¿Vacío? CompleteWork(¿Objeto? ¿Remitente? RunWorkerCompletedEventArgs? e)

{

this.label1. ¿Palabra? =?"Listo!";

}

¿Privado? int? ProcessProgress(¿Objeto? ¿Remitente? DoWorkEventArgs? e)

{

¿Para qué? (int?i?=?0;?i?<=?1000;?i++)

{

¿Si? (bkWorker. Cancelación pendiente)

{

e. =?Verdadero;

¿Devolver? -1;

}

Otros

{

//?Informe de estado

bkWorker. Informar de progreso (1);

//? La espera es muy importante para que la interfaz de usuario actualice la interfaz.

Sistema. hilo . hilo . dormir(1);

}

}

¿Regresar? -1;

}

} ?

Los siguientes son los resultados de ejecución.