2011-01-30 26 views
4

我有一個頁面,有5個部分。 每個部分都需要大約1秒的時間進行渲染。使用AJAX或多線程加快頁面加載

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

我想加快加載此頁面。但同時確保它不會減慢Web應用程序其他部分的性能,也不會使IIS崩潰。

的幾種方法:

  1. 使用AJAX請求。需要成爲Controller或Web Service的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. 移動,佔用時間,通常DB的請求,爲應用服務類的另一個DLL或外部Web服務的邏輯。喜歡的東西

OrderDTO GetDataForViewOrder(int orderID) 
{ 
} 

,並在DLL中使用多個線程。這種方法似乎提供了最佳的可伸縮性,但也將UI細節引入了Application Services層。

您認爲哪種方法最好,爲什麼?

回答

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 
} 
+0

是的,每個RenderSection對DB都有一個大的查詢,這是大部分時間佔用的。我檢查了異步Sql查詢,但它看起來像ADO.NET使用線程來完成異步執行,所以它可能會導致與其他解決方案的太多併發線程相同的問題。 – 2011-01-30 12:22:46

2

ajax。

線程並沒有多大幫助,因爲整個頁面需要等待所有線程完成。而且它不太可能是需要時間的ASP.NET本身。它更可能是你的數據庫或其他東西。線程還會增加應用程序的複雜性,而不會從中獲益。只能使用Web應用程序中的線程來執行維護任務,而其他任何事情都可以使用ASP.Net來解決。

使用ajax讓我們快速返回主頁面,並且只要他們從ajax請求中獲得結果,就會立即呈現所有部分。

1

一種選擇是,你可以使用異步頁面加載。但這全部在服務器端處理。本質上你註冊這些任務是異步執行的,並且等待讓他們完成。所以發送的http請求將一直等到所有任務完成。

第二個選項是ajax。這裏的好處是快速加載頁面。但是它並不適用於更新面板。尋找經典ajax的概念,而不是asp.net ajax。使用像jQuery這樣的庫會幫助很多。一旦頁面加載,您可以對所有五個部分進行ajax調用。你必須編寫代碼來返回所有這5個部分的內容。

當然,理想情況下,如果URL是mvc風格,則ajax請求是有意義的。但在我看來,asp.net處理程序以非常小的方式接近這些mvc樣式請求。