2011-10-25 19 views
5

Escribo una aplicación de Windows Forms en C# que ejecuta una gran cantidad de procedimientos de larga ejecución con un solo clic. Esto hace que la GUI se congele hasta la ejecución. Además, durante la ejecución, estoy registrando el estado de información & en un cuadro de lista. Sin embargo, hasta que se complete la ejecución, el estado no se actualiza en el cuadro de lista. ¿Cómo debo codificar para que el estado se actualice en el cuadro de lista en paralelo con la ejecución y para que la GUI no se congele?Ejecución asíncrona en formularios de Windows

Soy nuevo en el roscado. ¿Puedes dar un ejemplo de cómo se hace esto?

Gracias de antemano por su ayuda.

Respuesta

12

La manera más simple pero eficiente de manejar estos escenarios, es usar un BackgroundWorker.

Coloca su código pesado en el controlador de eventos DoWork y actualiza su GUI a través del controlador de eventos ProgressChanged.

puede encontrar un tutorial here
O incluso mejor que hicieron un "cómo" en msdn
Si tiene más preguntas específicas después de leerlo, estaré feliz de hacerlo.

+0

Muchas gracias. La solución es muy útil – RSP

4

Como dijo uno babuino camino a seguir es el enfoque Trabajador de otra manera si está utilizando .Net 4 o superior podría ser el uso de Task clase

clase de tareas simplifica la ejecución de código en el fondo y la interfaz de usuario de hilo según sea necesario . El uso de la clase de tareas se puede evitar escribir código adicional de la ambientación de eventos y devoluciones de llamada mediante el uso de tareas Continuation

Reed Copsey, Jr. tiene una muy buena series el paralelismo en .Net también echar un vistazo a lo

por ejemplo, una La forma sincrónica de hacer las cosas puede ser

//bad way to send emails to all people in list, that will freeze your UI 
foreach (String to in toList) 
{ 
    bool hasSent = SendMail(from, "password", to, SubjectTextBox.Text, BodyTextBox.Text); 
    if (hasSent) 
    { 
     OutPutTextBox.appendText("Sent to: " + to); 
    } 
    else 
    { 
     OutPutTextBox.appendText("Failed to: " + to); 
    } 
} 

//good way using Task class which won't freeze your UI 
string subject = SubjectTextBox.Text; 
string body = BodyTextBox.Text; 
var ui = TaskScheduler.FromCurrentSynchronizationContext(); 
List<Task> mails = new List<Task>(); 
foreach (string to in toList) 
{ 
    string target = to; 
    var t = Task.Factory.StartNew(() => SendMail(from, "password", target, subject, body)) 
    .ContinueWith(task => 
    { 
     if (task.Result) 
     { 
      OutPutTextBox.appendText("Sent to: " + to); 
     } 
     else 
     { 
      OutPutTextBox.appendText("Failed to: " + to); 
     } 
    }, ui); 
} 
+0

Tenga cuidado porque la biblioteca Parallel no siempre crea un nuevo hilo. Por ejemplo, Parallel.Foreach no creará un hilo para cada ciclo diferente. –

Cuestiones relacionadas