使用Timer來做Delay PageLoad

之前在做Portal時,因為有此資料會Load比較久,所以Boss就說要先呈現「載入中」才不會給User說,為何網頁Load那麼久,都「白帥帥」的。

 

前言

之前在做Portal時,因為有此資料會Load比較久,所以Boss就說要先呈現「載入中」才不會給User說,為何網頁Load那麼久,都「白帥帥」的。

實作

我們可以將頁面先顯示「載入中」的Panel,再利用Timer來Postback,在Timer的事件中寫入要Load資料的程式,這樣User就不會一直等到資料Load出來才看得到畫面了,這是個User感受問題。

  • Page實作

以下的Default.aspx中設定2個Panel,panBody做為呈現資料的區塊(預設是不顯示的),panTimer做為顯示「系統載入中...」的訊息。所以一開始因為都沒有Load資料,所以很快會先顯示panTimer的內容,因為有Timer,所以馬上就會再Postback去呼叫Timer的事件,所以就在Timer的Tick事件中寫讀取資料。


</asp:ScriptManager>
<asp:UpdatePanel ID="updMain" runat="server">
    <ContentTemplate>
        <asp:Panel ID="panBody" runat="server" Visible="false">
            <asp:GridView ID="GridView1" runat="server">
            </asp:GridView>
        </asp:Panel>
          <asp:Panel ID="panTimer" runat="server">
          系統載入中,請稍待.......
        </asp:Panel>
        <asp:Timer ID="trmLoad" runat="server" Interval="100">
        </asp:Timer>
    </ContentTemplate>
</asp:UpdatePanel>

 


''' 取得要呈現的資料
''' </summary>
''' <remarks></remarks>
Private Sub BindData()
    System.Threading.Thread.Sleep(3000)
    '建立空的DataTable
    Dim dtResult = New System.Data.DataTable("SC_1Funs")
    dtResult.Columns.Add("FUN_ITEM_NAME", Type.GetType("System.String"))
    dtResult.Columns.Add("FUN_ITEM_ID", Type.GetType("System.String"))
    '新增資料到DataTable之中
    dtResult.Rows.Add(New String() {"Fun1_name", "Fun1"})
    dtResult.Rows.Add(New String() {"Fun2_name", "Fun2"})
    Me.GridView1.DataSource = dtResult
    Me.GridView1.DataBind()
End Sub


''' <summary>
''' Timer事件
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Protected Sub trmLoad_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles trmLoad.Tick
    '只要做一次, For Delay Page Load
    trmLoad.Enabled = False
    '把載入中的Panel Hide起來
    panTimer.Visible = False
    '呼叫取得資料的函式
    BindData()
    '開啟要顯示的資料區塊
    panBody.Visible = True
End Sub
DelayPageLoad 
  • UserControl實作


在UserControl中也可以使用相同的方式,來達到Delay Page Load的效果哦!
UserControlDelayPageLoad  
image 

結論

使用Timer可以做個簡單的Delay Page Load! 我是Portal專案是直接將這些機制寫在BaseUserControl之中,並定義好Interface,所以所有的Widget都Support Delay Page Load的功能哦!

您可以看到UserControl的Delay Page Load效能比整頁Load好資料再顯示的方式還來的差,因為幾次Timer就多幾次Postback,而且是一次一次的Postback!所以要依實際運用做調整哦! 例如在每個UserControl加入Cache的機制。

Source Code:DelayPageLoad.rar

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^