3

这是我的问题。我正在开发一个网站,允许用户预订世界各地的酒店,就像 booking.com、expedia.com 等。

当用户搜索某个城市的酒店时,我通过 Web Services 与不同的提供商连接,然后显示结果。在几乎每个提供商中,这意味着:

1) 在 WS 中调用一个方法,返回所选日期城市中的可用酒店。对于这些酒店中的每一个:

  • 2) 从一个非常大的 XML 文件(通常超过 1 个)中读取,以获取地址、电话、传真、描述、服务等静态信息。
  • 3) 在 WS 中调用第二种方法来获取可用的房间信息。
  • 4) 显示结果

我遇到的问题与页面加载时间有关,这是这些网站的一个关键因素。

第一次调用 WS(第 1 点),这是必要的,我无能为力,所以这次我必须接受。另外两点也是必要的,但我的目的是通过在加载时显示酒店来改善用户体验。

假设您正在寻找布宜诺斯艾利斯的酒店。您输入“布宜诺斯艾利斯”作为您的目的地,然后点击“Buscar”按钮。您可能会注意到,在完全加载下一个页面之前,会显示一条加载消息。而不是等待所有酒店加载,我想做的,我认为会改善用户体验的是:

  1. 当用户点击“Buscar”按钮时,立即将用户发送到 HotelList 页面
  2. 显示每家酒店的信息,并在顶部显示一条消息,如“正在加载 1 家 XXX 家酒店”……“正在加载 2 家 XXX 家酒店”……

我一直在寻找描述如何实现这一点的 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 的建议兼容,即他所说的队列是正在构建为缓存中的条目的结果。

这个解决方案的一个很好的特点是,如果对一个地方有很多兴趣(每个人都去奥运会!)你的网站会变得更快。

我希望这很清楚。如果不是,请发布问题,我将尝试解释更多。

于 2011-05-01T01:50:15.953 回答