使用AJAX或多线程来加速页面加载

时间:2011-01-30 10:15:06

标签: asp.net ajax multithreading

我有一个包含5个部分的页面。 每个部分大约需要1秒钟才能渲染。

Page_Load()
{
   RenderSection1();  //1 sec
   RenderSection2();  //1 sec
   RenderSection3();  //1 sec
   RenderSection4();  //1 sec                  
   RenderSection5();  //1 sec
}

我想加快加载此页面的速度。但同时要确保它不会降低Web应用程序其他部分的性能,也不会使IIS崩溃。

有几种方法:

  1. 使用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

  2. 使用回答中描述的ASP.NET线程 right way to create thread in ASP.NET web application。所以我会为每个调用使用一个单独的线程: RenderSection1,RenderSection2等......

  3. 将占用时间的逻辑(通常是数据库请求)移动到另一个DLL或外部Web服务中的Application Service类中。像

  4. 这样的东西
    OrderDTO GetDataForViewOrder(int orderID)
    {
    }
    

    并在该DLL中使用多个线程。这种方法似乎提供了最佳的可伸缩性,但也在应用服务层中引入了UI细节。

    您认为哪种方法最好?为什么?

3 个答案:

答案 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样式请求。