私は、ブラウザー外で実行され、起動時にすべてが少し含まれる Silverlight 5 アプリケーションをまとめています。具体的には、次の手順に従う必要があります。
- アプリがブラウザーで実行されていないことを確認します (そうでない場合は、ユーザーにローカルにインストールするように指示する画面を表示します)。
- 「スプラッシュ スクリーン」を表示します (残りのステップの実行中にアニメーションが再生されると便利です)。
- MEF の構成
- サーバーからコンテキスト情報と「静的」データを事前にロードします (設定など)。このデータは、アプリケーション ロジックを実行する前に必要です。
- 外部テーマ ライブラリを含む追加の XAP ファイルを動的に読み込みます。
- 「スプラッシュ スクリーン」を、ナビゲーション フレームを含むシェルに置き換えます。
- アプリケーションの開始ページに移動します。
また、アプリケーション拡張サービス (IApplicationService、IApplicationLifetimeAware) もサポートする必要があるため、実装するプロセスはこれらのサービスを尊重する必要があります。これらのサービスのほとんどは、MEF を構成する必要があるため、MEF が構成され、インポートが完了する前に実行しないでください。
もう 1 つの考慮事項は、動的 XAP ファイルが取り込まれ、MEF が再構成された後にのみ、一部のインポートが満たされる可能性があることです。
私が直面しているハードルの 1 つは、前のステップが完了するまでステップ 5 を実行できないという事実です。XAP ファイルをロードするか、非同期でデータを取得するためにサーバーを呼び出すと、コードを続行できます。すべての構成が完了し、必要なすべてのコンテキスト データが読み込まれるまで、UI を「停止」する方法が必要です。
したがって、これらの要件をすべて満たす推奨されるアプローチを探しています。それが実用的なソリューションに役立つ場合は、喜んで詳細を提供します。
アップデート
この問題について私が言える最善の説明は、「スプラッシュ スクリーン」を表示するために UI スレッドを「解放」しなければならず、各ステップの実行中にアプリケーションの通常のライフ サイクルを一時停止する必要があるということです。アプリケーション サービスは既に開始されているため、Application.Start イベント ハンドラーですべてを実行することはできません (実行したくありません)。
さらに、UI スレッドを解放するということは、バックグラウンドで作業を行い、元のメソッド (Application.Start など) を返して、ランタイムが起動プロセスで前進することを意味します。たとえば、アプリケーション サービスの Starting メソッドでバックグラウンド プロセスを開始してから戻ると、ランタイムは Application オブジェクトで Start イベントを発生させることができます。しかし、次の作業を行う前にバックグラウンド プロセスを完了する必要がある場合は、UI をブロックする現在のスレッドを中断する必要があります。
そのため、作業をどのように分割するか、どこに配置するか (アプリ、アプリケーション サービス、ブートストラップ、ワークフローなど) がわかりません。