3

ここに私の問題があります。私は、booking.com や expedia.com などと同じように、ユーザーが世界中のホテルを予約できる Web サイトを開発しています。

ユーザーが特定の都市のホテルを検索すると、Web サービスを介してさまざまなプロバイダーに接続し、結果を表示します。ほとんどすべてのプロバイダーで、これは次のことを意味します。

1) WS でメソッドを呼び出して、選択した日付で市内の利用可能なホテルを返します。これらの各ホテルについて:

  • 2) 非常に大きな XML ファイル (通常は 2 つ以上) から読み取り、住所、電話、ファックス、説明、サービスなどの静的情報を取得します。
  • 3) WS で 2 番目のメソッドを呼び出して、利用可能な部屋の情報を取得します。
  • 4) 結果表示

私が抱えている問題は、これらの Web サイトの重要な要素であるページの読み込み時間に関係しています。

WS への最初の呼び出し (ポイント 1)、それは必要なことであり、私にできることはあまりないので、今回は受け入れなければなりません。他の 2 点も必要ですが、私の意図は、読み込み時にホテルを表示することで、ユーザー エクスペリエンスを向上させることです。

ブエノスアイレスのホテルを探しているとしましょう。目的地に「Buenos Aires」と入力し、「Buscar」ボタンを押します。お気づきかもしれませんが、次のページが完全にロードされるまで、ロード中のメッセージが表示されます。すべてのホテルが読み込まれるのを待つ代わりに、私がやりたいことは、ユーザー エクスペリエンスを向上させることだと思います。

  1. ユーザーが「Buscar」ボタンを押すと、すぐにユーザーを HotelList ページに送ります
  2. 各ホテルの情報が取得されると表示され、上部に「XXX ホテルの 1 つを読み込み中」...「XXX ホテルの 2 つを読み込み中」のようなメッセージが表示されます...

これを達成する方法を説明する ajax の例を探していましたが、明確な記事は見つかりませんでした。誰かが私を正しい方向に向けることができれば、本当に感謝しています。

ありがとう!

-------------------------------------------------- -------------------------

マルチスレッドを使用しようとしましたが、結果が表示されません。リテラル コントロールを使用して結果を表示しています。コードの一部を次に示します。

ホテルリスト.aspx

<asp:Literal ID="HotelesResultadoBusqueda" runat="server"></asp:Literal>

HotelList.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    ...
    ...
    ThreadStart job = new ThreadStart(CargarHoteles);
    Thread thread = new Thread(job);
    thread.Start();
}

private void CargarHoteles()
{
    // Load Hotels
    ArrayList hotels = WebService......
    foreach(Hotel hotel in hotels)
    {.....}
    ....
    this.HotelesResultadoBusqueda.Text = "...";
}
4

2 に答える 2

1

「到着すると」に関して、最も簡単なことは、バックエンドで保留中のアイテムの(スレッドセーフな)キューを構築することです。つまり、新しい結果がキューに入れられ、JSONクエリが数秒ごとに新しいデータをポーリングします(そのセッションの) キュー内。

再パフォーマンス; それをプロファイリングし、プロファイルが示しているビットを攻撃するだけです。XML をいくつかのインデックス付き構造 (おそらくデータベース) にプリロードすることは、私の主な推測です...

于 2011-04-30T18:51:41.030 に答える
0

これが私の考えです。目標は、CargarHoteles() ホテル関数の結果をキャッシュすることです。キャッシュしているため、ユーザー インターフェイスがすばやく応答している間、バックグラウンド プロセスで作業を行うことができます。

クライアントが最初にパラメータ セットに関する情報を要求すると、サービスはそのパラメータ セットの一意の ID を返します (既にキャッシュにあるかどうかを確認し、存在する場合はそれを返します)。クライアントが一意の ID を取得すると、サーバーにいくつかの結果を要求し始めます (それらが既にキャッシュにある場合は、すぐに返されます)。または、サブセットが戻ってきて、検索がどれだけ行われたかを示します。

サーバー側では、ワーカー プロセス (またはプロセス - このソリューションを使用すると、適切な方法があれば、タスクでより多くのマシン/プロセスを使用できます。たとえば、すべての xml ファイルのタスクです)。これらのワーカーは、問題を解決し、結果をキャッシュに入れます。完了すると、そのキャッシュ項目に完了のフラグが立てられます。次にクライアントがさらに情報を要求すると、すべての結果が得られていることがわかります。

この設計は、Marc の提案と互換性があることに注意してください。つまり、彼が話しているキューは、キャッシュ内のエントリとして構築されている結果です。

このソリューションの優れた機能の 1 つは、1 つの場所 (誰もがオリンピックに行く予定です!) に多くの関心がある場合、Web サイトが高速になることです。

これが明確であることを願っています。そうでない場合は質問を投稿してください。もっと説明しようと思います。

于 2011-05-01T01:50:15.953 に答える