C# 如何在ASP.NET 4中异步加载页面,同时不断检查进度?
我有一个ASP.NET网站,目前正在使用.NET Framework 4。我在用C语言编程。没有MVC,只有普通的旧web表单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来源/媒体/活动、当前正在进行的销售/促销等,并且是动态计算的 除此之外,您还可以按价格
问题 这里的交易:有一个页面可能是非常密集的(缓慢加载),这取决于用户在这个列表中的项目数量。(有点像愿望清单,但某些用户有2000多个iTen) 这些物品是在网站上出售的产品。这些项目具有不同的功能和价格,并且有一个侧栏,您可以在其中筛选列表。价格取决于很多因素,例如用户的utm来源/媒体/活动、当前正在进行的销售/促销等,并且是动态计算的 除此之外,您还可以按价格范围进行过滤,每个过滤器的右边都有一个小数字,指示属于它的项目数量 例如:
$200~$400(130)
-此价格范围内有130种商品
它目前正在工作,但如果用户有太多的项目,页面可能会非常慢,因为我必须过滤和计算所有项目,并计算它们的价格。在第二次请求之后,由于缓存的原因,速度非常快,但是一些用户在第一次加载时已经经历了超时,这是一件坏事
我试过什么 页面本身有3个用户控件:
有办法吗?我查阅了有关异步处理程序、信号器、Comet的文章,但我仍然不清楚……看起来您需要缓存和AJAX调用的组合 您提到缓存——您是手动执行还是利用browser/.NET的内置功能 您可能想看看DB级别的优化。索引和使用SQLManagementStudio评估查询执行计划(这将告诉您查询中最耗时的部分)在这里非常有用。您甚至可以设置聚合表来表示用户通常求和或计数的数据的总和和计数 我认为缓存大约是你工作的90%。通过AJAX检索数据不会加快速度,但如果逻辑不连续,它将允许您同时执行多项操作
我将首先调查您可以做些什么来优化您的数据库,并看看您可以在那里获得什么收益。我最终使用了
任务和任务并行库(TPL)
在请求页面时,我创建并启动一个任务
,该任务过滤项目,等待大约60个项目完成(至少创建分页)并交付页面。然后我缓存对任务的引用大约15分钟(滑动过期)。完成每个项目后,任务使用BroadcastBlock
发布一个值以更改计数,并发布与过滤器相关的其他内容,我可以在页面中使用这些内容
任务本身将继续进行,当我再次请求页面时(通过计时器或页面重新加载),我将通过缓存获取其引用。然后,我通过这些块接收我想要的所有信息,并相应地进行更新
这样,我不需要我的用户在处理页面之前等待流程完成,我可以逐步加载页面
但是,我了解到,如果在ASP.NET环境中创建线程,则需要考虑一些事情,例如异常处理和AppDomain回收
以下是我找到的一些关于这些注意事项和其他信息的链接:
我认为您可以使用当前使用的确切方法,但只需进行一些调整。由于updatepanel中的计时器立即启动,您可以让它在计时器的事件处理程序中进行检查,以查看缓存是否已填充。如果是,则填充所有项目,如果不是,则仅填充下一个100或其他项目。您知道是否有某种方法可以流式传输结果,而不是轮询服务器吗?您可以,但不容易。它不是HTTP设计的模型。使用AJAX的原因不是为了让它更快,而是为了让用户的页面加载,他们可以看到加载图标和页面上的所有其他信息,而不是仅仅因为一个页面没有完成就不加载整个页面。@Servy确定,但是如果他的站点都是关于显示数据的,显示漂亮的图像和“加载”与IE旋转其实没什么不同(我同意对用户来说这可能“更好”,但对于我们这些了解背景情况的人来说,我们知道这并不能帮助他们更快地完成工作)。不过,你的观点是正确的。你假设他们唯一想使用的东西取决于他们所使用的东西