1

私は、ブラウザー外で実行され、起動時にすべてが少し含まれる Silverlight 5 アプリケーションをまとめています。具体的には、次の手順に従う必要があります。

  1. アプリがブラウザーで実行されていないことを確認します (そうでない場合は、ユーザーにローカルにインストールするように指示する画面を表示します)。
  2. 「スプラッシュ スクリーン」を表示します (残りのステップの実行中にアニメーションが再生されると便利です)。
  3. MEF の構成
  4. サーバーからコンテキスト情報と「静的」データを事前にロードします (設定など)。このデータは、アプリケーション ロジックを実行する前に必要です。
  5. 外部テーマ ライブラリを含む追加の XAP ファイルを動的に読み込みます。
  6. 「スプラッシュ スクリーン」を、ナビゲーション フレームを含むシェルに置き換えます。
  7. アプリケーションの開始ページに移動します。

また、アプリケーション拡張サービス (IApplicationService、IApplicationLifetimeAware) もサポートする必要があるため、実装するプロセスはこれらのサービスを尊重する必要があります。これらのサービスのほとんどは、MEF を構成する必要があるため、MEF が構成され、インポートが完了する前に実行しないでください。

もう 1 つの考慮事項は、動的 XAP ファイルが取り込まれ、MEF が再構成された後にのみ、一部のインポートが満たされる可能性があることです。

私が直面しているハードルの 1 つは、前のステップが完了するまでステップ 5 を実行できないという事実です。XAP ファイルをロードするか、非同期でデータを取得するためにサーバーを呼び出すと、コードを続行できます。すべての構成が完了し、必要なすべてのコンテキスト データが読み込まれるまで、UI を「停止」する方法が必要です。

したがって、これらの要件をすべて満たす推奨されるアプローチを探しています。それが実用的なソリューションに役立つ場合は、喜んで詳細を提供します。

アップデート

この問題について私が言える最善の説明は、「スプラッシュ スクリーン」を表示するために UI スレッドを「解放」しなければならず、各ステップの実行中にアプリケーションの通常のライフ サイクルを一時停止する必要があるということです。アプリケーション サービスは既に開始されているため、Application.Start イベント ハンドラーですべてを実行することはできません (実行したくありません)。

さらに、UI スレッドを解放するということは、バックグラウンドで作業を行い、元のメソッド (Application.Start など) を返して、ランタイムが起動プロセスで前進することを意味します。たとえば、アプリケーション サービスの Starting メソッドでバックグラウンド プロセスを開始してから戻ると、ランタイムは Application オブジェクトで Start イベントを発生させることができます。しかし、次の作業を行う前にバックグラウンド プロセスを完了する必要がある場合は、UI をブロックする現在のスレッドを中断する必要があります。

そのため、作業をどのように分割するか、どこに配置するか (アプリ、アプリケーション サービス、ブートストラップ、ワークフローなど) がわかりません。

4

1 に答える 1

0

ManualResetEvent クラスを使用して、サービス呼び出しを強制的に同期することができます (そして、それらが完了する順序を保証します)。これを使用して、バックグラウンド スレッドをメイン UI スレッドに同期することもできます。

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

于 2012-06-01T16:10:02.423 に答える