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崩溃。
有几种方法:
使用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线程在ASP.NET Web应用程序中创建线程。因此,我将为每个调用使用单独的线程:RenderSection1,RenderSection2等。
将占用时间的逻辑(通常是数据库请求)移到另一个DLL或外部Web服务中的Application Service类中。就像是
OrderDTO GetDataForViewOrder(int orderID)
{
}
Run Code Online (Sandbox Code Playgroud)
并在该DLL中使用多个线程。这种方法似乎提供了最佳的可伸缩性,但是还将UI详细信息引入了Application Services层。
您认为哪种方法最好,为什么?
虽然线程可以帮助完成单页加载(前提是您的服务器至少有 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)
归档时间: |
|
查看次数: |
3145 次 |
最近记录: |