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

C# 如何在ASP.NET 4中异步加载页面,同时不断检查进度?,c#,asp.net,asynchronous,.net-4.0,timer,C#,Asp.net,Asynchronous,.net 4.0,Timer,我有一个ASP.NET网站,目前正在使用.NET Framework 4。我在用C语言编程。没有MVC,只有普通的旧web表单 问题 这里的交易:有一个页面可能是非常密集的(缓慢加载),这取决于用户在这个列表中的项目数量。(有点像愿望清单,但某些用户有2000多个iTen) 这些物品是在网站上出售的产品。这些项目具有不同的功能和价格,并且有一个侧栏,您可以在其中筛选列表。价格取决于很多因素,例如用户的utm来源/媒体/活动、当前正在进行的销售/促销等,并且是动态计算的 除此之外,您还可以按价格

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


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

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

除此之外,您还可以按价格范围进行过滤,每个过滤器的右边都有一个小数字,指示属于它的项目数量

例如:

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


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


我试过什么 页面本身有3个用户控件:

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

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

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

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


    有办法吗?我查阅了有关异步处理程序、信号器、Comet的文章,但我仍然不清楚……

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

    您提到缓存——您是手动执行还是利用browser/.NET的内置功能

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

    我认为缓存大约是你工作的90%。通过AJAX检索数据不会加快速度,但如果逻辑不连续,它将允许您同时执行多项操作


    我将首先调查您可以做些什么来优化您的数据库,并看看您可以在那里获得什么收益。

    我最终使用了
    任务和
    任务并行库(TPL)

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

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

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

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

    以下是我找到的一些关于这些注意事项和其他信息的链接:


    我认为您可以使用当前使用的确切方法,但只需进行一些调整。由于updatepanel中的计时器立即启动,您可以让它在计时器的事件处理程序中进行检查,以查看缓存是否已填充。如果是,则填充所有项目,如果不是,则仅填充下一个100或其他项目。您知道是否有某种方法可以流式传输结果,而不是轮询服务器吗?您可以,但不容易。它不是HTTP设计的模型。使用AJAX的原因不是为了让它更快,而是为了让用户的页面加载,他们可以看到加载图标和页面上的所有其他信息,而不是仅仅因为一个页面没有完成就不加载整个页面。@Servy确定,但是如果他的站点都是关于显示数据的,显示漂亮的图像和“加载”与IE旋转其实没什么不同(我同意对用户来说这可能“更好”,但对于我们这些了解背景情况的人来说,我们知道这并不能帮助他们更快地完成工作)。不过,你的观点是正确的。你假设他们唯一想使用的东西取决于他们所使用的东西