He heredado una aplicación de Winforms que hace muchas llamadas de larga ejecución en el servidor de aplicaciones desde el hilo de UI, por lo que la UI no responde, inutilizable, imposible de cerrar desde hace bastante tiempo . (Lo cual me hace muy vaya AAAAAAAAARGH!)Cómo bloquear la interfaz de usuario de Winforms mientras se ejecuta el hilo de fondo
planeo mover el servidor llama a un subproceso de fondo y tener la interfaz de usuario para minusválidos - pero se puede cerrar móvil & - mientras que el subproceso de fondo hace su trabajo.
Entonces, ¿cuál sería la mejor manera de inhibir la entrada del usuario a mi aplicación? Estoy pensando en el "diálogo modal de progreso", pero preferiría una solución que no me obligue a mostrar imágenes en la cara del usuario (algunas operaciones del servidor se ejecutan en menos de 500ms, por lo que un cuadro de diálogo es no óptimo ...)
¿Hay alguna forma en Winforms para evitar que el usuario inicie acciones o cambie datos en la aplicación mientras permite seleccionar algunas cosas (cambiar el tamaño, mostrar, ocultar y familia y el usuario cierra la ventana)? Preferiría una forma que no me haga acceder a todos los elementos de la interfaz de usuario en mis formularios y configurarlo como deshabilitado ... hay bastantes de ellos y esa aplicación realmente tiene un "pirateado en el diseñador de la interfaz de usuario hasta que muestra cosas llamativas "estilo de código fuente. No hay manera de refactorización CADA cosa maloliente hasta la fecha de lanzamiento ...
Ah, por cierto, esta aplicación vive en .NET Framework 2
¿Por qué no se desactiva el botón que inició la llamada de larga ejecución? –
La interfaz de usuario es un formulario de entrada de datos, la llamada de larga ejecución podría ser un "guardado" que involucra muchos objetos de dominio. Quiero evitar que el usuario cambie datos en el formulario mientras se ejecuta el guardado, por ejemplo. Por cierto ESTO (http://stuffthathappens.com/blog/2008/03/05/simplicity) es TAN verdadero ... – froh42
¿Cuándo quieres habilitar de nuevo el formulario? Si intenta hacer eso en el evento "_RunWorkerCompleted" obtendrá una excepción porque no tiene permitido (http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx - primera nota). Solo puede hacerlo manualmente para cada elemento en el formulario o para el primer contenedor. – Edd