asp.net计时器不工作

asp.net计时器不工作,asp.net,timer,Asp.net,Timer,我是aspx新手,无法让我的网络计时器工作。我错过了什么?另外,DebugSet.logoutTime=1800000和DebugSet.logotWarnings=3。用户在退出系统前,每分钟都会收到警告。这些设置将在发布前提高,我只是出于测试目的降低了它们 public partial class test : System.Web.UI.Page { private LoggedUser _User; private Timer LogoutTimer; priva

我是aspx新手,无法让我的网络计时器工作。我错过了什么?另外,DebugSet.logoutTime=1800000和DebugSet.logotWarnings=3。用户在退出系统前,每分钟都会收到警告。这些设置将在发布前提高,我只是出于测试目的降低了它们

public partial class test : System.Web.UI.Page
{
    private LoggedUser _User;
    private Timer LogoutTimer;
    private int TmCnt = 0;
    protected void Page_Load(object sender, EventArgs e)
    {
        _User = new LoggedUser(true);
        SetTimer();
    }
    private void SetTimer()
    {
        LogoutTimer = new Timer();
        LogoutTimer.Interval = DebugSet.logoutTime/DebugSet.logoutWarnings;
        LogoutTimer.Tick += new EventHandler<EventArgs>(LogoutTimer_Tick);
        LogoutTimer.Enabled = true;
        LogoutTimer.ViewStateMode = ViewStateMode.Enabled;
    }
    private void LogoutTimer_Tick(object sender, EventArgs e)
    {
        TmCnt++;
        if (TmCnt == DebugSet.logoutWarnings)
        {
            _User.UserLoggedIn = false;
            _User.SetSessions();
            LogoutTimer.Enabled = false;
            HttpContext.Current.Session["FCSWarning"] = "LoggedOut";
            Response.Redirect("../Views/index.aspx");
        }
        else
        {
            int i = (DebugSet.logoutTime / (1000 * 60)) - ((DebugSet.logoutTime / (1000 * 60)) * TmCnt);
            string msg = "<Script language=javascript>alert('You will be logged out in " + i.ToString() + " min. due to inactivity.');</Script>";
            Response.Write(msg);
        }
    }
}
公共部分类测试:System.Web.UI.Page
{
私人日志用户;
私人定时器注销定时器;
私有int TmCnt=0;
受保护的无效页面加载(对象发送方、事件参数e)
{
_用户=新日志记录器(真);
SetTimer();
}
私有void SetTimer()
{
LogoutTimer=新计时器();
LogoutTimer.Interval=DebugSet.logoutTime/DebugSet.logoutWarnings;
LogoutTimer.Tick+=新事件处理程序(LogoutTimer_Tick);
LogoutTimer.Enabled=true;
LogoutTimer.ViewStateMode=ViewStateMode.Enabled;
}
私有void LogoutTimer_勾选(对象发送方,事件参数e)
{
TmCnt++;
if(TmCnt==DebugSet.logoutWarnings)
{
_User.UserLoggedIn=false;
_User.SetSessions();
LogoutTimer.Enabled=false;
HttpContext.Current.Session[“FCSwarming”]=“LoggedOut”;
Response.Redirect(“../Views/index.aspx”);
}
其他的
{
inti=(DebugSet.logoutTime/(1000*60))-((DebugSet.logoutTime/(1000*60))*TmCnt);
string msg=“警报('由于不活动,您将在“+i.ToString()+”分钟内注销');”;
响应。写入(msg);
}
}
}

您使用的是winforms计时器(我想)。对于网站,当页面发送到浏览器时,所有变量和类的实例都会被销毁(垃圾收集)。因此,
LogoutTimer
只存在很短的时间。您需要使用定时器控件

您在使用网站时也应该了解这一点,页面生命周期:

是一个ASP.NET控件。每个ASP.NET控件都必须添加到页控件层次结构中,否则,它将无法正确运行或根本无法运行

将计时器添加到页面控件层次结构:

LogoutTimer = new Timer();
LogoutTimer.ID = "MyTimer";
this.Controls.Add(LogoutTimer);
LogoutTimer.Interval = DebugSet.logoutTime/DebugSet.logoutWarnings;
...

请注意,这是一个糟糕的想法。如果有人在两个不同的选项卡中打开了你的页面怎么办?也许他们没有弄乱其中一个标签,而是在另一个标签上工作。在超时之后,他们会莫名其妙地从您的网站上注销这两个选项卡。如果他们正在填写表单或有其他未保存的更改,则可能导致数据丢失。你真的需要考虑其中的含义。我的应用程序只允许他们登录到一个会话中。如果他们已经登录,那么他们将无法登录。阿加尼没有说他们可以多次登录。你似乎不熟悉网络的无状态本质。某人可以打开多个选项卡/窗口访问您的网站,即使他们只登录过一次。如果你有这个超时逻辑,就像你在问题中描述的那样,它会导致糟糕的用户体验。