2009-01-13 9 views
5

Tengo un formulario con botones, cuadros de texto y controles de usuario en él. Cuando se hace clic en un botón, llama a un método en otra clase. En esta clase, se abre un cuadro de mensaje. Cuando el usuario hace clic en Aceptar, el cuadro de mensaje se cierra y el método de clase continúa durante 10 segundos aproximadamente antes de finalizar. Durante estos 10 segundos, cualquiera que sea el cuadro de texto, o el botón en el que se haya terminado el cuadro de mensaje, se muestra el cuadro de mensaje (no se vuelven a pintar).Cómo forzar botones, cuadros de texto para volver a pintar en forma después de un cuadro de mensaje se cierra en C#

La pregunta es ¿cómo puedo forzar todo lo que volver a pintar en el formulario. El problema es la clase que tiene el messageBox no tiene ningún conocimiento de la forma que lo llamó

Frank

Respuesta

0

Para forzar todo lo que volver a pintar puede llamar Invalidar() en el formulario principal.

6

es que el 10 segundos pasaban haciendo el trabajo en su totalidad en la interfaz de usuario? Si no, realmente debería hacerse en un hilo separado. Incluso si actualiza el formulario, aún tendrá una IU que no responde durante 10 segundos, lo que no es ideal.

Ver my threading tutorial para un ejemplo de ejecución de código en un hilo diferente y volver a llamar al hilo de interfaz de usuario. Tenga en cuenta que esta es la "vieja" forma de hacer las cosas: BackgroundWorker hace las cosas un poco más simples.

+0

Acepto que debe iniciarlo en un hilo diferente. – Vincent

8

Usted puede tratar con

Application.DoEvents() 

justo después cierra el cuadro de mensaje. Sin embargo, a menos que ejecutes el método al que llamas en esa otra clase en un hilo de fondo, tu UI no responderá durante 10 segundos.

+0

Gracias, eso me ayudó. – xyz

0

Tu problema es que estás haciendo tu trabajo en el hilo de la interfaz de usuario. La interfaz de usuario no se volverá a pintar hasta que regrese su método, lo que permitirá que el bucle de mensajes de Windows continúe.

La solución es ejecutar el método de trabajo en un subproceso diferente. Quizás la clase BackgroundWorker resolverá su problema muy bien.

Editar: Consulta este artículo para una explicación más profunda:
http://www.yoda.arachsys.com/csharp/threads/winforms.shtml

+0

LOL - ambos estábamos editando para referirnos al mismo artículo :) –

3

El problema aquí es que usted tiene el procesamiento que se está produciendo en el subproceso de interfaz de usuario y bloquear el mensaje de pintura. Llamar Actualizar o Invalidar no va a solucionar esto, ya que todavía está bloqueando el hilo que realizaría esas operaciones.

En su lugar, debe llevar a cabo ese procesamiento y moverlo a otro subproceso, y luego actualizar su subproceso de interfaz de usuario (correctamente, a través del método Invoke, más probable que) mientras realiza el trabajo en el subproceso de fondo.

Cuestiones relacionadas