如何在不断检查进度的同时异步加载 ASP.NET 4 中的页面

本文关键字:ASP 加载 NET 异步 检查 | 更新日期: 2023-09-27 18:30:52

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


问题所在

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

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

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

例:

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


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


我试过什么

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

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

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

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

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

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

有什么办法可以做到这一点吗?我已经检查了有关异步处理程序,SignalR,Comet的文章,但我仍然一无所知......

如何在不断检查进度的同时异步加载 ASP.NET 4 中的页面

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

您提到了缓存 - 您是手动执行还是利用浏览器/。NET内置的东西?

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

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

我会先调查你可以做些什么来调整你的数据库,看看你能在那里实现什么收益。

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

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

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

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

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

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

在asp网络中实现重复性后台任务的危险

Web 应用程序中的并发性

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