Cómo mostrar una barra de progreso

Recientemente estoy trabajando en una herramienta de análisis de registros VSS, usando C# para el desarrollo. Después de completar todas las funciones, descubrí que descargar registros VSS desde el servidor requiere mucho tiempo. La experiencia no es buena, así que prepárate para agregar una barra de progreso.

Dado que C# no se usa con frecuencia, parece difícil crear una barra de progreso de una sola vez, y otras tareas de desarrollo también se están llevando a cabo al mismo tiempo, por lo que ayer no hubo mucho progreso.

Hoy es fin de semana, así que puedo aprovecharlo. Después de consultar mucha información y ejemplos en línea, hice varios ejemplos para usarlos más adelante.

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

Primer tipo: use BackgroundWorker para controlar la barra de progreso

El objeto BackgroundWorker tiene tres eventos principales:

DoWork: cuando se realiza la operación multiproceso del objeto BackgroundWorker se ejecuta desencadenado cuando.

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

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

WorkerReportsProgress: si desea que el objeto BackgroundWorker informe el progreso en tiempo real del hilo de forma asincrónica, el valor de esta propiedad debe establecerse 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 ejemplo 1, controla la visualización de la barra de progreso en el formulario principal

[csharp]?view Plaincopy

public?partial?class?Form1?:? ¿Formulario?

{?

///?

?

///?Hilo de fondo?

/// ?

?

privado?BackgroundWorker?bkWorker?=?new?BackgroundWorker();?

///?

?

///?Valor del paso?

///?

?

privado?int?percentValue?=?0;?

público? Form1()?

{?

InitializeComponent();?

bkWorker.WorkerReportsProgress?=?true;?

bkWorker. WorkerSupportsCancellation?=?true;?

bkWorker.DoWork?+=?new?DoWorkEventHandler(DoWork);?

bkWorker.ProgressChanged?+=?new?ProgressChangedEventHandler(ProgessChanged) ; ?

bkWorker.RunWorkerCompleted?+=?new?RunWorkerCompletedEventHandler(CompleteWork);?

}?

privado?void?btnStart_Click(objeto?remitente,? ¿EventArgs?e)?

{?

percentValue?=?10;?

this.progressBar1.Maximum?=?1000;?

//?¿Realizar operaciones en segundo plano?

bkWorker.RunWorkerAsync();?

}?

public?void?DoWork(object?sender , ?DoWorkEventArgs?e)?

{?

//?Procesamiento de eventos, ¿especificar la función de procesamiento?

e.Result?=?ProcessProgress(bkWorker, ?e);?

}?

público?void?ProgessChanged(objeto?remitente,?ProgressChangedEventArgs?e)?

{?

//?bkWorker.ReportProgress? se llamará aquí, ¿donde puede personalizar el método de generación de informes?

this.progressBar1.Value?=?e.ProgressPercentage;?

int?percent?=?(int)(e.ProgressPercentage?/?percentValue);?

this.label1.Text?=?"Progreso del procesamiento:"?+?Convert.ToString(percent) ? +?"%";?

}?

público?void?CompleteWork(objeto?remitente,?RunWor

kerCompletedEventArgs?e)?

{?

this.label1.Text?=?"Procesado!";?

}

privado?int?ProcessProgress(objeto?remitente,?DoWorkEventArgs?e)?

{?

para?(int?i?=?0;?i?<= ? 1000;?i++)?

{?

if?(bkWorker.CancellationPending)?

{?

e.Cancel ? =?verdadero;?

regresar?-1;?

}?

¿otro?

{?

//?¿Informe de estado?

bkWorker.ReportProgress(i);?

//?En espera, se utiliza para actualizar la interfaz de usuario, ¿muy importante?

System.Threading.Thread.Sleep(1);?

}?

}

retorno?-1;?

}?

} ?

Los siguientes son los resultados