winforms - evento - Actualizar etiqueta mientras se procesa en Windows Forms
evento load c# (4)
Si su procesamiento es extenso hágalo en un hilo de Backgroundworker.
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
¿Cuál es la mejor manera de actualizar una etiqueta en una aplicación de Windows Forms durante el proceso?
Tengo un bucle que procesa algunos archivos en el sistema del usuario cuando el usuario hace clic en un botón.
foreach (System.IO.FileInfo f in dir.GetFiles("*.txt"))
{
// Do processing
// Show progress bar
// Update Label on Form, "f.Name is done processing, now processing..."
}
¿Qué sería un código de muestra?
¿Cómo se llama esto exactamente? ¿Está enhebrando o delegados?
Una solución rápida para usted sería:
Label1.Text = f.Name + " is done processing, now processing...";
Label1.Refresh();
Realmente desea evitar DoEvents
, de lo contrario, tendrá problemas si su usuario presiona repetidamente los botones en su formulario.
Debería hacer esto en otro subproceso y luego actualizar su subproceso de interfaz de usuario desde ese subproceso. Está bloqueando el procesamiento posterior realizando este trabajo en el subproceso de interfaz de usuario.
Si no puede mover este código al hilo de la interfaz de usuario, entonces siempre puede llamar a Application.DoEvents
, pero le sugiero que explore estas opciones primero:
Necesitarás obtener tus datos de un hilo a otro. Esto se puede hacer de varias maneras ...
En primer lugar, su hilo de "fondo" podría actualizar algún tipo de variable de cadena "CurrentStatus" que cambia a medida que avanza. Luego podría poner un temporizador en su formulario que luego tomaría la variable CurrentStatus y actualizaría la etiqueta con ella.
En segundo lugar, puede invocar simplemente la operación del subproceso en segundo plano al subproceso de interfaz de usuario con un delegado que utiliza la propiedad InvokeRequired del control de etiqueta. Así por ejemplo...
private delegate void UpdateStatusDelegate(string status);
private void UpdateStatus(string status)
{
if (this.label1.InvokeRequired)
{
this.Invoke(new UpdateStatusDelegate(this.UpdateStatus), new object[] { status });
return;
}
this.label1.Text = status;
}
Puede llamar a ese método UpdateStatus () desde cualquier subproceso (UI o fondo), y detectará si necesita o no invocar la operación en el subproceso principal de UI (y si es así, lo hace).
Para configurar realmente el hilo, puede hacerlo así:
private void StartProcessing()
{
System.Threading.Thread procThread = new System.Threading.Thread(this.Process);
procThread.Start();
}
private void Process() // This is the actual method of the thread
{
foreach (System.IO.FileInfo f in dir.GetFiles("*.txt"))
{
// Do processing
// Show progress bar
// Update Label on Form, "f.Name is done processing, now processing..."
UpdateStatus("Processing " + f.Name + "...");
}
}
Luego, cuando el usuario haga clic en el botón "IR", simplemente llamará a StartProcessing ().