Cómo mostrar 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.