0

asp.net Web サイトに自動更新機能を実装しています。

ユーザーは Web サイトでログインを行い、更新が必要なテーブルがある特定のページに移動すると、テーブルを更新するタイマーが作成されます。

ただし、ユーザーがログアウトするか、セッションが期限切れになると、タイマーは実行され続けます。これを 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" />
4

1 に答える 1

0

Aristos が投稿した質問に対する最初のコメントに同意します。これは悪い設計です。この状況では、次の 3 つのオプションを提案します。

  1. asp.net Ajax コントロールを使用します。例はここにあります: http://www.tutorialspoint.com/asp.net/asp.net_ajax_control.htm
  2. AJAX ポーリング - クライアントに配置される JavaScript のタイマーを使用します。タイマーが経過時間を過ぎると、クライアントはサーバーに対して AJAX 要求を行い (できれば Web サービスを呼び出します)、更新されたデータを取得します。これには、JQuery などの JavaScript ライブラリを使用することをお勧めします。ajax 関数に関するドキュメントは、http: //api.jquery.com/jQuery.ajax/にあります。
  3. SignalR などのリアルタイム機能を提供するライブラリの使用を検討してください。ライブラリ サイトへのリンクは次のとおりです: http://signalr.net/

個人的な意見です。3 つのオプションすべての中で、3 番目が最も「エレガントな」ソリューションを提供します。1 番目のオプションでは、asp.net AJAX コントロールを使用する必要があります。これは、見苦しい HTML を生成し、操作が困難になる可能性があります。また、真の「リアルタイム」の側面を取り除くタイマーがクライアントに作成されます。2 番目のオプションは、再びクライアントにタイマーを配置し、真の「リアルタイム」の側面を取り除きます。3 番目のオプションでは、サーバーが接続されたクライアントを「認識」できるようになり、利用可能な場合、「ハブ」を使用してデータがクライアントにプッシュされます。

この学習曲線の交差点にいる間に、クライアント側の JavaScript 設計パターンを調べて、クライアント上でコードを構造化することをお勧めします。使用する優れたツールは、次の場所にある Knockout です。

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 も使用することをお勧めします。

于 2013-06-25T14:48:03.177 に答える