3

我有一个 ASP.NET 网站,目前正在使用 .NET Framework 4。我正在用 C# 编程。没有 MVC,只有普通的旧 Web 表单。


问题

这是交易:有一个页面可能非常密集(加载缓慢),具体取决于用户在此列表中拥有的项目数量。(有点像愿望清单,但某些用户上面有 2000 多个项目)

这些物品是在网站上出售的产品。这些项目具有不同的功能和价格,并且有一个侧边栏,您可以在其中过滤您的列表。价格取决于很多因素,例如用户的 utm 来源/媒体/活动、当前正在进行的销售/促销等,并且是即时计算的。

最重要的是,您可以按价格范围进行过滤,并且每个过滤器都有一个小数字,指示属于它的商品数量。

例子:

$200 ~ $400 (130)- 此价格范围内有 130 件商品


它目前正在工作,但如果用户有太多商品,页面可能会非常慢,因为我必须过滤和计算所有商品,并计算它们的价格。在第二次请求之后,由于缓存,一切都很快,但是有些用户在第一次加载时已经经历了超时,这是一件坏事。


我试过什么

页面本身有 3 个用户控件:

  1. 一种是列表菜单等
  2. 一个是侧边栏
  3. 一是产品清单

我在列表菜单中需要相同的信息,我需要在侧边栏中,我也需要在产品列表中。我决定同步加载产品列表的第一页,然后加载侧边栏和菜单。菜单上有项目的总数:希望和购买。

我可以通过 UpdatePanel 和 Timer 成功加载剩余信息。计时器以相对较快的间隔触发,并获得大约 100 个项目。它更新 HiddenField 中的当前状态,我在下一个请求中使用它来获取接下来的 100 个项目,直到我获得所有项目,然后停止计时器。

但是...当我按 F5 并再次加载它时,它会以相同的频率发出请求,因为 Timer 仍然存在。但由于信息已经被缓存,我什至根本不需要计时器。

我正在寻找一种解决方案,可以告诉服务器加载所有记录,但在此之前提供页面......然后客户端每 2 或 3 秒轮询一次服务器,并检查已经加载了哪些记录,并且相应地更新侧边栏和菜单列表。

有没有办法做到这一点?我查看了有关异步处理程序、SignalR、Comet 的文章,但我仍然一无所知...

4

2 回答 2

0

看起来您需要缓存和 AJAX 调用的组合。

你提到缓存——你是手动做的还是利用浏览器/.NET的内置东西?

您可能想查看 DB 级优化。索引和使用 SQL Management Studio 来评估查询执行计划(这将告诉您查询中最耗时的部分)在这里将非常有帮助。您甚至可以设置汇总表来表示用户通常汇总或计数的数据的总和和计数。

我认为缓存大约是您工作的 90%。通过 AJAX 检索数据不会使其更快,但如果您的逻辑不是顺序的,它将允许您一次执行多项操作。

我会先调查你可以做些什么来调整你的数据库,然后看看你可以在那里获得什么收益。

于 2013-09-09T18:54:00.870 回答
0

我最终使用TasksTask Parallel Library (TPL).

在请求页面后,我创建并启动Task过滤项目,等待大约 60 个项目完成(至少创建分页)并交付页面。然后我缓存一个对 Task 的引用大约 15 分钟(滑动到期)。完成每个项目后,Task 使用 a 发布一个值BroadcastBlock<int>来更改计数,并发布与过滤器相关的其他内容,我可以在我的页面中使用这些内容。

Task本身将继续运行,当我再次请求页面时(通过计时器或页面重新加载),我将通过缓存获取它的引用。然后,我通过这些块接收我想要的所有信息,并相应地更新。

这样我就不需要我的用户在处理页面之前等待该过程完成,并且我可以逐步加载页面。

但是,我了解到如果您在 ASP.NET 环境中创建线程,则需要考虑一些事情,例如异常处理AppDomain 回收

以下是我找到的有关这些警告和其他信息的一些链接:

在asp net中实现重复后台任务的危险

Web 应用程序中的并发性

在 asp.net 应用程序中执行异步工作或任务

于 2013-09-27T12:15:30.533 回答