我有一个包含5个部分的页面。 每个部分大约需要1秒钟才能渲染。
Page_Load()
{
RenderSection1(); //1 sec
RenderSection2(); //1 sec
RenderSection3(); //1 sec
RenderSection4(); //1 sec
RenderSection5(); //1 sec
}
我想加快加载此页面的速度。但同时要确保它不会降低Web应用程序其他部分的性能,也不会使IIS崩溃。
有几种方法:
使用AJAX请求。需要成为控制器或Web服务的MVC样式请求 在每个部分周围使用UpdatePanel都不起作用 - 因为如果我尝试使用这里的方法同时提交刷新到多个UpdatePanel: http://encosia.com/2007/07/13/easily-refresh-an-updatepanel-using-javascript/, 最后一个请求将永远胜利: http://www.codeproject.com/Tips/57035/Simultanious-Async-Requests-Using-Multiple-Update-.aspx
使用回答中描述的ASP.NET线程 right way to create thread in ASP.NET web application。所以我会为每个调用使用一个单独的线程: RenderSection1,RenderSection2等......
将占用时间的逻辑(通常是数据库请求)移动到另一个DLL或外部Web服务中的Application Service类中。像
OrderDTO GetDataForViewOrder(int orderID)
{
}
并在该DLL中使用多个线程。这种方法似乎提供了最佳的可伸缩性,但也在应用服务层中引入了UI细节。
您认为哪种方法最好?为什么?
答案 0 :(得分:2)
AJAX。
线程没有多大帮助,因为整个页面需要等待所有线程完成。它不太可能是ASP.NET本身需要时间。它更可能是你的数据库或其他东西。线程还会为您的应用程序增加更多复杂性,而不会从中获得太多收益。只使用Web应用程序中的线程来执行维护任务,其他一切都可以使用ASP.Net来解决。
使用ajax让你快速返回主页面,一旦从ajax请求得到结果,就会呈现所有部分。
答案 1 :(得分:2)
虽然线程可以帮助单个页面加载(假设您的服务器至少有5个CPU内核),那么它不是可扩展的方法。如果3个用户同时点击该应用程序该怎么办?然后,您将需要服务器上的15个核心来实现性能提升。
AJAX可以是一个解决方案,但它遇到了相同的可伸缩性问题,因为每个AJAX请求都会获得自己的线程。从好的方面来看,AJAX为最终用户提供了先前的速度提升,因为即使页面的滞后部分需要相同的时间,他也可以看到正在加载的内容。
你真的需要看一下,如果来自数据库的性能是异步数据库查询。您可以为页面的5个部分启动5个异步调用,并最多可将加载时间减少5倍。但它会使代码更复杂。此外,如果您正在选择将其与AJAX方法相结合,则需要查看异步ASP.NET页面或异步WCF服务,以避免在存在大量用户时出现可伸缩性问题,因为每个用户将占用5个线程。
异步调用的代码大致如下所示:
Page_Load()
{
BeginDBRequest1();
BeginDBRequest2();
BeginDBRequest3();
BeginDBRequest4();
BeginDBRequest5();
data1 = EndDBRequest1();
data2 = EndDBRequest2();
data3 = EndDBRequest3();
data4 = EndDBRequest4();
data5 = EndDBRequest5();
//all of the above calls take the time of the max time call and not the sum of the times
RenderSection1(data1); //1 sec
RenderSection2(data2); //1 sec
RenderSection3(data3); //1 sec
RenderSection4(data4); //1 sec
RenderSection5(data5); //1 sec
}
答案 2 :(得分:1)
一个选项是您可以使用异步页面加载。但这都是在服务器端处理。基本上,您正在注册这些任务以异步执行,等待以完成它们。因此,发送的http请求将等待所有任务完成。
第二个选项是ajax。这里的好处是页面加载速度很快。但是它并不适用于更新面板。寻找经典ajax的概念,而不是asp.net ajax。使用像jQuery这样的库会有很大帮助。页面加载后,您可以对所有五个部分进行ajax调用。您必须编写代码来返回所有这5个部分的内容。
当然,如果网址是mvc样式,理想情况下ajax请求是有意义的。但在我看来,asp.net处理程序以非常小的方式接近那些mvc样式请求。