我正在整理一个 Silverlight 5 应用程序,该应用程序将在浏览器之外运行,并且在启动时拥有一些东西。具体来说,这是我需要遵循的步骤:
- 检查应用程序是否耗尽了浏览器(如果没有,显示一个屏幕指示用户在本地安装它)。
- 显示一个“启动画面”(如果在执行剩余步骤的同时播放动画,那就太好了)。
- 配置 MEF
- 从服务器预加载上下文信息和“静态”数据(例如,设置)。在运行任何应用程序逻辑之前需要此数据。
- 动态加载其他 XAP 文件,包括外部主题库。
- 将“启动画面”替换为包含导航框架的外壳。
- 导航到应用程序的起始页。
我还需要支持应用程序扩展服务(IApplicationService、IApplicationLifetimeAware),因此我实现的任何流程都必须尊重这些服务。这些服务中的大多数都需要配置 MEF,因此在配置 MEF 并满足导入之前它们不应执行。
另一个考虑因素是,只有在动态 XAP 文件被拉入并重新组合 MEF 之后,才能满足某些导入。
我遇到的障碍之一是在前面的步骤完成之前我无法执行第 5 步。加载 XAP 文件或异步调用服务器获取数据允许代码继续执行。我需要一种方法来“停止” UI,直到所有组合都完成并且所有必需的上下文数据都已加载。
因此,我正在寻找满足所有这些要求的推荐方法,如果这有助于找到可行的解决方案,我很乐意提供更多详细信息。
更新
对于我的困难,我能给出的最好解释是,我必须“释放” UI 线程以显示“启动屏幕”,但在每个步骤执行时还要暂停应用程序的正常生命周期。我不能(也不想)在 Application.Start 事件处理程序中做所有事情,因为应用程序服务已经启动。
另外,释放 UI 线程意味着我确实在后台工作并让原始方法(例如 Application.Start)返回,并且运行时将在启动过程中前进。例如,在应用程序服务的启动方法中启动后台进程然后返回允许运行时在应用程序对象上引发启动事件。但是,如果我需要在执行下一件事之前完成后台进程,我必须挂起阻塞 UI 的当前线程。
所以我不确定如何划分工作或将其放在哪里(应用程序、应用程序服务、引导程序、工作流等)。