まず最初に、私の要件はあなたの要件とまったく同じではありません。私の問題は、バックエンドデータベースが少し遅くなる傾向があり、ユーザーの応答性が非常に重要であるということでした。
したがって、方程式からデータベースの相互作用を削除する必要がありました。
私のソリューションには2つの主要な部分があります。
データのサーバー側キャッシュを維持する
サーバーと対話できるすべてのデータベース作業を含む別のプロセスを作成します
別のプロセスは、Windowsサービスによってホストされる名前付きパイプWCFサービスとして実装されました。
基本的なプロセスの概要は次のとおりです。
- ユーザーが[保存]をクリックすると、AjaxがフォームをMvcコントローラーに投稿します
- コントローラはキャッシュデータを更新してから、WCFパイプを呼び出します
- サービスはデータを(セッションIDとともに)同時キューにプッシュし、GUIDトークンを返します
- コントローラーはトークンをJSON応答として返します。
- jQuery Ajaxハンドラーは応答をインターセプトし、トークンを6.「保存済み」フォームを表すUI要素に保存します。
サービス自体は次のように機能します。
- 開始時にタイマーを作成します。
- タイマーティック:
- タイマーを停止します。
- キューに入れられたすべての作業項目を並行キューから削除します
- ワークプロセッサで処理する各アイテムを送信します
- 以前のセッションIDでキー設定された「完了」または「エラーあり」の同時辞書にアイテムを追加します(古いデータを排除するために時間を確保します)。これには、元の作業トークンが含まれます。
- タイマーを再開します。
ユーザーランドに戻ると、javascriptsetIntervalループが実行されています。
- サーバー(ハートビートコントローラー)へのAjaxリクエスト
- コントローラはサービスに接続し、現在のセッションIDを渡します
- このサービスは、「完了」および「エラー」辞書からすべてのアイテムを返します
- コントローラはリストをJSONオブジェクト配列として返します
- javascriptは返されたリストをループし、トークンを使用して適切なUI更新を行います
最終的には、バックエンドの永続性サーバーが遅いにもかかわらず、非常に応答性の高いUIになります。
実装コードの特定の部分が必要な場合は、私に知らせてください。