.net - tutorial - Formularios de Windows: bucles de eventos mĂșltiples
winforms c# (5)
¿Por qué crees que necesitas más de un ciclo de mensajes? Un bucle de mensaje puede manejar cualquier cantidad de ventanas.
Si encuentra que una operación de larga ejecución en una ventana es capaz de colgar toda la aplicación, la respuesta es dividir el trabajo de larga duración en algo similar a un BackgroundWorker , dejando la IU receptiva.
La programación con varios subprocesos, cada uno con su propia interfaz de usuario, es mucho más complicada, porque un subproceso no puede acceder a las ventanas y los controles creados a partir de otro subproceso.
Tengo una aplicación de Windows Forms (.NET) que puede tener varios documentos abiertos simultáneamente.
Sería conveniente tener cada documento (formulario) ejecutando su propio ciclo de eventos. Con una breve experimentación, el inicio de varios bucles de eventos en sus propios hilos STA parece funcionar. ¿Hay alguna razón por la cual esta es una mala idea?
Las formas sin formas pueden ser más apropiadas para su propósito. Use form.Show () en lugar de form.ShowDialog ().
Podría ser más inteligente utilizar un contenedor MDI (Multiple Document Interface) y formularios secundarios. En este caso, cada documento estaría en su propia forma, lo que técnicamente significa que cada documento tiene su propia cola de mensajes.
Solo tenga cuidado al acceder a los elementos de la GUI desde los hilos.
Creo que está perfectamente bien crear múltiples bucles de mensajes en diferentes hilos. Lo único a lo que hay que tener cuidado es cuando se trata de herramientas de interfaz de usuario de terceros, a veces almacenan identificadores como miembros estáticos (en lugar de ThreadStatic) y si tiene múltiples subprocesos de interfaz de usuario en su aplicación, tendrá problemas (en mi caso, encontré que los aceleradores de teclado de la barra de herramientas / menú no funcionaban correctamente).
Una de las principales razones para hacer esto es si tiene cuadros de diálogo modales que aparecen en los diferentes diálogos no modificados. Si coloca todo en el mismo bucle de mensaje, si uno de los cuadros de diálogo no modal tiene un cuadro de diálogo modal, toda la aplicación (todas las ventanas) estará bloqueada hasta que cierre el diálogo modal.
Y, como Kevin decía, ten cuidado con las llamadas de ventana cruzada (cross-window). Puede usar Control.BeginInvoke o Control.Invoke para publicar llamadas de delegado en los otros subprocesos de UI.
La otra cosa a considerar es cómo va a salir de su proceso. Lo más probable es que necesite realizar un seguimiento de los bucles de mensajes para poder detenerlos cuando desee cerrar todo. Si no te importa y solo quieres que el proceso finalice cuando todas las ventanas estén cerradas, puedes hacerlo también.