我正在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" />
答案 0 :(得分:0)
我同意Aristos发布的问题的第一条评论,这是糟糕的设计。 对于这种情况,我建议三种选择:
现在是个人意见;在所有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。