2012-06-14 16 views
5

Uso VS2010 y C# para crear una aplicación de escritorio. Esta aplicación tiene un formulario con una gran tarea que lleva mucho tiempo completar. Cuando se inicia esta forma funciona perfectamente, excepto que muestra “No responde” en la barra de título, como muestra la imagen:Cómo evitar que un mensaje no responda en la barra de título de una ventana?

enter image description here

Después de completar todas las tareas, que muestra la salida deseada. ¿Por qué se muestra este mensaje y cómo lo evito?

+0

He votado porque esta es una pregunta legítima para alguien que no tiene mucha experiencia. – siride

Respuesta

4

Necesita utilizar un BackgroundWorker para que la tarea que consume tiempo se ejecute en una secuencia separada de forma asincrónica. Eso permitirá que Windows multitarea haga que la UI responda. Debe usar un cursor de espera u otro indicador visual para que el usuario sepa que su aplicación está ocupada.

De MSDN MSDN BackgroundWorker

La clase BackgroundWorker le permite ejecutar una operación en un hilo separado, dedicado. Las operaciones que consumen mucho tiempo, como las descargas y las transacciones de bases de datos, pueden hacer que su interfaz de usuario (UI) parezca que ha dejado de responder mientras se están ejecutando. Cuando desea una interfaz de usuario receptiva y se enfrenta a largas demoras asociadas con tales operaciones, la clase BackgroundWorker proporciona una solución conveniente.

Para ejecutar una operación que consuma tiempo en segundo plano, cree un BackgroundWorker y escuche los eventos que informan el progreso de su operación y la señal cuando finaliza su operación. Puede crear BackgroundWorker programáticamente o puede arrastrarlo a su formulario desde la pestaña Componentes de la Caja de herramientas. Si crea el BackgroundWorker en el Diseñador de Windows Forms, aparecerá en la Bandeja de componentes y sus propiedades se mostrarán en la ventana Propiedades.

Para configurar una operación en segundo plano, agregue un controlador de eventos para el evento DoWork. Llame a su operación que consume mucho tiempo en este controlador de eventos. Para iniciar la operación, llame a RunWorkerAsync. Para recibir notificaciones de actualizaciones de progreso, gestione el evento ProgressChanged. Para recibir una notificación cuando se complete la operación, maneje el evento RunWorkerCompleted.

1

Debe ejecutar su gran tarea en una cadena de fondo para no bloquear la hebra de la IU (principal).

+0

BlackSpy gracias por responder, no entiendo estas líneas "bloquear el hilo de la interfaz de usuario (principal)", por favor, dígale a algunos en detalle. – shamim

+1

Sugeriría hacer una investigación sobre la clase Backgroundworker y ejecutar sus procesos allí. Eso evitará que la IU se congele mientras espera que se complete su operación de larga ejecución. Esto se debe a que el "trabajo" se ejecuta en un subproceso diferente al de la interfaz de usuario, por lo que los eventos de interfaz de usuario (pintura, actualización, etc.) no están bloqueados. – tsells

Cuestiones relacionadas