ajax|asp.net|解決|網頁|問題
提要:ASP.NET為相當耗時的處理提供了幾種解決方案。其中,最好的方法之一是把線程與查詢方案或AJAX技術進行結合。
一、 前言
人們不得不等待。事實上,使用者在操作電腦時,如果等待時間超過大約200毫秒,他們一般都感到厭煩。當你的基於全球資訊網的應用程式使用一個需要耗費許多秒甚至幾分鐘的進程時,這可能成為一個問題。顯然,你不可能僅通過建立一個進度條對話方塊或一等待游標就算萬事大吉。
幸好,ASP.NET為此提供了一些不同的解決方案來處理這種相當耗時的進程-具體情況要依賴於要求的互動層級和你願意處理的複雜程度。本文首先通過一個應用程式範例來說明這個問題並且通過兩種方案來運行:一種使用了簡單查詢技術,而另一種使用一種更進階的AJAX解決方案。
千萬警惕,在.NET架構中已發現存在一些錯誤的方式。其中之一就是IAsyncHTTPHandler-乍看來,它似乎有助於較長網頁的請求。然而,這個非同步HTTP處理器卻是被設計用來釋放處理器的-儘管,此時在一頁面之上的某些任務需耗費一些時間但是並不需要任何CPU。一個好的例子就是在一頁面的中間發出Web請求。在這種情況中,非同步HTTP處理器是很有效率的。
二、 問題
在本文中,我要討論一個不同的問題。在本應用程式範例中,我建立了一個頁面-它用於為五個不同的機場報告當前的溫度、風級和另外一些天氣資訊。Web服務要花費大約五秒鐘來取得每一項資料。因此,如果我讓該頁面如圖1所示運行,那麼在伺服器返回一頁面前要花費大約一分鐘-這對於任何使用者都是無法接受的等待時間。
圖1.等待:最開始的應用程式範例大約需要一分鐘來載入頁面。 |
這個相當耗時的頁面相應的HTML顯示於列表1中(詳見下載原始碼)。
頁面裝載事件代碼為資料格子建立一個資料集。然後,迅速處理多個機場並且調用該web服務以得到資料。然後,該方法把資料從web服務填充到該資料集並且把它依附於一個格子控制項(見圖2)。
圖2.基本的:該應用程式範例的Web服務執行一簡單的天氣狀況查詢。 |
這個web服務的WSDL是http://www.capeclear.com/AirportWeather.wsdl。它定義了許多不同的方法,我將僅使用其中的一個getSummary方法-它返回一個包括機場的位置、天空條件、風速、可見度甚至更多的資料區塊。
用這種方式,即使單個伺服器請求也要比單個頁面取回消耗更多的時間。另外一種選擇是讓一個線程運行於後台來取得資料,而由前端頁面連續地監視該線程的輸出。
三、 線程解決方案
線程解決方案提供給使用者一種更為乾淨的體驗-因為它們可以周期性地得到處理的更新。這裡的響應是很容易準備的,儘管在背景處理可能花一些時間,但是作為響應卻可以馬上返回。
為處理此線程系統,我將使用兩個類和一個介面。JobHandler singleton負責維持一個對象集合-它實現IJob介面。這個JobHandler管理系統線程。每添加一個工作建立一個新線程,並且該工作上的Start方法在一個新線程內被調用。一個被用於後面查詢工作的ID字串被返回。
該Job系統相應的UML顯示於圖3。
圖3.這個螢幕快照顯示出該Job系統相應的UML。 |
WeatherJob是一個Ijob的實現-它負責從機場中的一個指定集合進行天氣查詢並且填充一個稱作Data的包含天氣報告的DataSet。
該JobHandler singleton相應的代碼顯示於列表2(詳見下載原始碼)-相當直接。唯一有趣的一點是AddJob方法,它為該工作建立一個新的線程並調用Start方法。
這些工作的介面顯示於列表3(詳見下載原始碼)。其中的構造器為該工作建立資料集合。而且Start方法,通過每個機場,調用WEB請求並且在該資料集合中儲存返回的資料。
[1] [2] 下一頁