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

Eri*_*c P 5 asp.net ajax multithreading

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

Page_Load()
{
   RenderSection1();  //1 sec
   RenderSection2();  //1 sec
   RenderSection3();  //1 sec
   RenderSection4();  //1 sec                  
   RenderSection5();  //1 sec
}
Run Code Online (Sandbox Code Playgroud)

我想加快此页面的加载。但是同时请确保它不会降低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线程在ASP.NET Web应用程序中创建线程。因此,我将为每个调用使用单独的线程:RenderSection1,RenderSection2等。

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

OrderDTO GetDataForViewOrder(int orderID)
{
}
Run Code Online (Sandbox Code Playgroud)

并在该DLL中使用多个线程。这种方法似乎提供了最佳的可伸缩性,但是还将UI详细信息引入了Application Services层。

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

Sti*_*gar 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  
} 
Run Code Online (Sandbox Code Playgroud)