¿Cuál es la mejor manera de actualizar una etiqueta en una aplicación de Formularios Windows forms, mientras que el tratamiento?

Tengo un bucle que hace que el procesamiento de 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..."
}

Lo que sería el código de ejemplo?

¿Qué es exactamente este llamado? Es roscado o delegados?

InformationsquelleAutor Picflight | 2009-02-20

5 Comentarios

  1. 61

    Una solución rápida para usted sería:

    Label1.Text = f.Name + " is done processing, now processing...";
    Label1.Refresh();

    Usted realmente desea evitar DoEvents, de lo contrario tendrás problemas si el usuario presiona repetidamente los botones en el formulario.

  2. 13

    Que debe estar haciendo esto en otro hilo y, a continuación, actualizar el subproceso de interfaz de usuario a partir de ese hilo. Usted está bloqueando su posterior procesamiento mediante la realización de este trabajo en el subproceso de interfaz de usuario.

    Si no puede mover este código para el subproceso de interfaz de usuario, entonces usted siempre puede llamar a Aplicación.DoEvents, pero me fuertemente sugerimos explorar estas opciones:

    • Estoy de acuerdo con esto – especialmente para BackgroundWorker. Yo lo uso con frecuencia a mí mismo. BackgroundWorkers hacer multi-threading operaciones como esta simple y fácil!
  3. 13

    Que usted necesita para obtener los datos de un hilo a otro. Esto se puede hacer en un par de maneras…

    Primero, el «fondo» hilo se podría actualizar algún tipo de «CurrentStatus» variable de cadena que cambia a medida que avanza. Entonces, puedes poner un contador de tiempo en el formulario a continuación, tomar la CurrentStatus variable y actualización de la etiqueta con ella.

    Segundo, usted podría simplemente la invocación de la operación del subproceso de fondo para el subproceso de interfaz de usuario con un delegado utilizando el InvokeRequired propiedad de la etiqueta de control. 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;
    }

    Usted puede llamar a que UpdateStatus() método de cualquier subproceso de interfaz de usuario (UI o de fondo), y es la de detectar si no se necesita invocar la operación en la interfaz principal del hilo (y si es así, ¿).

    Establecer, de hecho, el hilo, puedes 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 + "...");                
            }
        }

    A continuación, cuando el usuario hace clic en el botón «IR» usted simplemente llame StartProcessing().

    • Debe ser la respuesta perfecta.
  4. 1

    Yo también recomendamos el uso de :

    Application.DoEvents();

    Los procesos de todos los mensajes de Windows actualmente en la cola de mensajes.

    • ¿Leyó Patricio respuesta: stackoverflow.com/a/570569/4731718 ?
    • Me gusta mucho la solución DoEvents pero tienes razón, me han contestado muy rápido tal vez. Al menos se le da ideas a los demás cómo utilizar DoEvents

Dejar respuesta

Please enter your comment!
Please enter your name here