Implementación de tareas de inicio para la aplicación SL5 OOB

Estoy armando una aplicación Silverlight 5 que se ejecutará fuera del navegador y tiene un poco de todo al iniciarse. Específicamente, estos son los pasos que debo seguir:

  1. Verifique que la aplicación se esté quedando sin navegador (si no es así, muestre una pantalla que indique al usuario que la instale localmente).
  2. Muestre una "pantalla de inicio" (sería bueno si esto reprodujera animaciones mientras se ejecutan los pasos restantes).
  3. Configurar MEF
  4. Precarga información de contexto y datos 'estáticos' del servidor (por ejemplo, configuraciones). Estos datos son necesarios antes de que se pueda ejecutar la lógica de la aplicación.
  5. Cargue dinámicamente archivos XAP adicionales, incluida una biblioteca de temas externa.
  6. Reemplace la "pantalla de inicio" con el caparazón que contiene un marco de navegación.
  7. Navegue a la página de inicio de la aplicación.

También necesito admitir los Servicios de extensión de aplicaciones (IApplicationService, IApplicationLifetimeAware), por lo que cualquier proceso que implemente debe respetar estos servicios. La mayoría de estos servicios requerirán que se configure MEF, por lo que no deberían ejecutarse antes de que se haya configurado MEF y se hayan realizado las importaciones.

Otra consideración es que algunas importaciones pueden satisfacerse solo después de que se hayan extraído los archivos XAP dinámicos y se haya recompuesto MEF.

Uno de los obstáculos con los que me estoy topando es el hecho de que no puedo hacer el paso 5 hasta que se completen los pasos anteriores. Cargar los archivos XAP o llamar al servidor para obtener datos de forma asincrónica permite que el código continúe. Necesito una forma de "detener" la interfaz de usuario hasta que se complete toda la composición y se hayan cargado todos los datos de contexto requeridos.

Por lo tanto, estoy buscando enfoques recomendados que satisfagan todos estos requisitos y me complace brindar más detalles si eso ayuda a llegar a una solución funcional.

ACTUALIZACIÓN

La mejor explicación que puedo dar para mi dificultad es que debo 'liberar' el subproceso de la interfaz de usuario para mostrar una 'pantalla de inicio' pero también suspender el ciclo de vida normal de la aplicación mientras se ejecuta cada paso. No puedo (y no quiero) hacer todo en el controlador de eventos Application.Start porque los servicios de la aplicación ya se habrán iniciado.

Además, liberar el subproceso de la interfaz de usuario significa que trabajo en segundo plano y dejo que el método original (Application.Start, por ejemplo) regrese y el tiempo de ejecución avanzará en el proceso de inicio. Por ejemplo, iniciar un proceso en segundo plano en el método de inicio de un servicio de aplicación y luego regresar permite que el tiempo de ejecución genere el evento de inicio en el objeto de la aplicación. Pero si necesito que se complete el proceso en segundo plano antes de que pueda hacer lo siguiente, tengo que suspender el hilo actual que bloquea la interfaz de usuario.

Así que no estoy seguro de cómo dividir el trabajo o dónde colocarlo (aplicación, servicio de aplicación, programa previo, flujo de trabajo, etc.).

preguntado el 22 de mayo de 12 a las 20:05

¿Eso es todo? ¿Qué has probado? -

He realizado la mayoría de los pasos individualmente pero no juntos. Deliberadamente no me metí en las diversas implementaciones porque estoy buscando lo que otros tienen o harían en lugar de centrarme en lo que yo hice o no (especialmente porque no he tenido éxito en ponerlo todo junto). -

1 Respuestas

Puede usar la clase ManualResetEvent para forzar la sincronización de las llamadas de servicio (y garantizar el orden en que se completan). También puede usar esto para sincronizar el subproceso de fondo con el subproceso principal de la interfaz de usuario.

http://mohundro.com/blog/2006/06/27/a-little-bit-about-manualresetevent/

Respondido el 01 de junio de 12 a las 17:06

Mi problema no es sincronizar el subproceso de fondo con el subproceso principal de la interfaz de usuario. Mi problema es que la interfaz de usuario pasa por un ciclo de vida (IApplicationService.StartService, IApplicationLifetimeAware.Starting, Application.Start, IApplicationLifetimeAware.Started). No quiero que se produzca Application.Start hasta que se hayan completado todas las operaciones que se ejecutan en el inicio (por ejemplo), PERO necesito que la interfaz de usuario se actualice en algún momento para que se muestre el 'splash'. - hijodepirata

Si ejecuto alguna de estas operaciones en un subproceso en segundo plano, el subproceso de la interfaz de usuario continuará a lo largo del ciclo de vida y no tendré el flujo de trabajo previsto donde las operaciones se realizan en la secuencia requerida para garantizar que se hayan completado los pasos anteriores. - hijodepirata

No puede hacer esto en el subproceso principal de la interfaz de usuario en Silverlight, no es posible. - EkoostikMartin

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.