2013-06-25 22 views
0

我正在asp.net網站上實現自動刷新功能。如何在會話結束後刪除定時器?

用戶在網站上進行登錄,並且如果他轉到具有需要刷新的表的特定頁面,則會創建刷新表的計時器。

但是當用戶註銷或會話過期時,定時器繼續運行。現在爲X用戶乘以這個值,並且我們將在服務器上運行X定時器。

當不再需要定時器時,擺脫定時器的最佳方式是什麼?

到目前爲止,我的代碼如下:

protected static System.Timers.Timer _timer; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    ... 
    ServiceStatus serv = new ServiceStatus(); 
    OutSubscricoesInfoV2 subscr = new OutSubscricoesInfoV2(); 
    serv = StreamerUtils.GetSubscricoesStreamer(ref subscr); 

    if (serv != null && serv.success) 
    { 
     StreamerUtils.StreamerState strState = StreamerUtils.GetStreamerState(subscr); 

     if (strState != null && strState.IsActive) 
     { 
      startAutoRefresh(); 
     } 
    } 

} 

private void startAutoRefresh() 
{ 
    if (Session["RefreshTimer"] == null) 
    { 
     _timer = new System.Timers.Timer(10000); 

     _timer.Elapsed += new ElapsedEventHandler(OnTimedEvent); 

     _timer.Enabled = true; 

     Session["RefreshTimer"] = _timer; 
    } 
} 

private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    //TODO: call refresh function 
} 

在我的網頁,我有以下按鈕,用戶可以單擊刷新表:

<asp:ImageButton runat="server" ID="RefreshCot" OnClientClick="javascript:StocksListControl.TriggerPostBack(); return false;" CausesValidation="false" ImageUrl="/_layouts/images/refresh-title.png" /> 
+1

這是非常糟糕的設計,每個計時器都會啓動一個新線程,並且在結束後您不清除它。如果你對每個用戶都有一些工作問題,可以考慮找一些其他的方法來做。 – Aristos

+0

也許你可以創建這個定時器客戶端。因此,在x時間之後,您請求使用javascript更新表格。 –

+0

我不明白服務器端計時器如何刷新表格。 ElapsedEventHandler是否曾打過電話? – Alexander

回答

0

我第一個同意對Aristos發佈的問題發表評論,這是糟糕的設計。 對於這種情況,我建議三種選擇:

  1. 使用一個asp.net Ajax控件。一個例子可以在這裏找到:http://www.tutorialspoint.com/asp.net/asp.net_ajax_control.htm
  2. AJAX極化 - 在JavaScript中定時器將坐在客戶端上。一旦定時器已經過去了它的時間,客戶端就會向服務器發出一個AJAX請求(最好調用Web服務)來獲取更新後的數據。我建議爲此使用一個JavaScript庫,如JQuery。在他們的AJAX功能的文檔在這裏找到: http://api.jquery.com/jQuery.ajax/
  3. 考慮使用提供實時的功能,如SignalR庫,這裏是一個鏈接到圖書館網站: http://signalr.net/

現在的個人意見;在所有3個選項中,第3個將爲您提供最「優雅」的解決方案。 第一個選項將要求您使用asp.net AJAX控件,該控件生成醜陋的HTML並且可以成爲一隻小豬。此外,客戶端上的定時器將被創建,從而消除真正的「實時」方面。 第二個選項將再次將定時器放在客戶端上,消除真正的「實時」方面。 第三個選項將允許服務器「知道」連接的客戶端,數據應該通過使用「集線器」推送到客戶端(如果可用)。

雖然你在這個學習曲線十字路口,我還建議尋找一些客戶端JavaScript設計模式,以幫助在客戶端上構建您的代碼。使用可能是淘汰賽一個偉大的工具,在這裏找到:

http://knockoutjs.com/index.html

下面是關於如何使用SignalR使用此教程:

http://www.codeproject.com/Articles/322154/ASP-NET-MVC-SIngalR-and-Knockout-based-Real-time-U

本教程主要介紹如何使用ASP.NET MVC。我想這應該可以與Web表單互換,但是,如果該選項對您可用,我會建議使用MVC。

+0

我忘了提及該頁面已經有一個按鈕,點擊後,表格會刷新。代碼如下: '' 另外,在自動刷新開始之前,我需要驗證用戶是否擁有該功能。自動刷新只有在這種情況下才會發生。我可以用第三種方法做到這一點嗎? –

相關問題