会话结束后如何删除计时器?

时间:2013-06-25 14:14:01

标签: c# asp.net session iis-7 timer

我正在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 个答案:

答案 0 :(得分:0)

我同意Aristos发布的问题的第一条评论,这是糟糕的设计。 对于这种情况,我建议三种选择:

  1. 使用asp.net Ajax控件。可以在此处找到一个示例:http://www.tutorialspoint.com/asp.net/asp.net_ajax_control.htm
  2. AJAX poling - 让JavaScript中的计时器位于客户端上。一旦计时器超过其经过的时间,客户端将向服务器发出AJAX请求(最好是调用Web服务)以获取更新的数据。我建议使用JavaScript库,例如JQuery。有关其ajax函数的文档可在此处找到: http://api.jquery.com/jQuery.ajax/
  3. 考虑使用提供实时功能的库,例如SignalR,这是一个指向库网站的链接: http://signalr.net/
  4. 现在是个人意见;在所有3个选项中,第3个将为您提供最“优雅”的解决方案。 第一个选项将要求您使用asp.net AJAX控件,它会生成丑陋的HTML并且可以成为一个可以使用的猪。此外,将创建客户端上的计时器,其中删除真正的“实时”方面。 第二个选项将再次将定时器放在客户端上,删除真正的“实时”方面。 第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。