如何使用 asp.net 计时器控件停止倒数计时器?

How do I stop countdown timer using asp.net timer control?

我在我的项目中插入了一个倒数计时器。当我 运行 它时,计时器启动,但当我停止调试它时,一段时间后我再次 运行 它然后我注意到,计时器仍然是 运行ning。例如,我给计时器设置了 3 分钟的时间,即 3 分钟后它应该重定向到结果页面......现在我 运行 页面和倒计时计时器开始......当我停止调试时它假设在 00:02:45(剩余时间) 和 5 秒后当我再次 运行 它然后计时器继续 00:02:40(剩余时间) 。 我不希望这样的事情发生。如何停止计时器的继续? 看看我的代码。告诉我我在哪里犯了错误以及解决方案是什么。

在TimerTest.aspx.cs页面上,我有以下几行代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;



public partial class Student_TimerTest : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{

    if (Session["end_t"] == null)
    {
        DateTime start_time = DateTime.Now;
        DateTime end_time = start_time.AddMinutes(3);
        Session["end_t"] = end_time;
    }
}

protected void timer1_tick(object sender, EventArgs e)
{
    DateTime dt = (DateTime)Session["end_t"];
    DateTime dt_curr = DateTime.Now;
    TimeSpan ts = dt - dt_curr;
    lblTimer.Text = ts.Hours.ToString() + ":" + ts.Minutes.ToString() + ":" + ts.Seconds.ToString();
    if (ts.Minutes == 0)
    {
        timer1.Enabled = false;
        Response.Redirect("/Student/Result.aspx");
    }

}
}

在 TimerTest.aspx 页面上,我插入了以下代码行:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TimerTest.aspx.cs" Inherits="Student_TimerTest" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>

</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:ScriptManager ID= "SM1" runat="server"></asp:ScriptManager>
        <asp:Timer ID="timer1" runat="server" Interval="1000" OnTick="timer1_tick"></asp:Timer>
        </div>
   
       <div>
       <asp:UpdatePanel id="updPnl" runat="server" UpdateMode="Conditional">
       <ContentTemplate>
       <asp:Label ID="lblTimer" runat="server"></asp:Label>
       </ContentTemplate>
       <Triggers>
       <asp:AsyncPostBackTrigger ControlID="timer1" EventName ="tick" />
       </Triggers>
       </asp:UpdatePanel>
</div>  
</form>
</body>
</html>

说定时器还是运行有点误导。退出调试后实际上没有任何代码运行。 但是,您将开始时间存储在会话状态中,默认情况下,会话状态存储在浏览器中。如果您停止调试然后重新启动,您的 Web 应用程序的 应用程序实例 将重新启动,但您的 浏览器 会保留会话状态。所以你的浏览器仍然有旧的开始时间。因此,在页面加载时,行 if (Session["end_t"] == null) 导致 false那里有一个值。

这里有很多选项,但如果不是 post,则总是在页面加载时清除该值。如果它 一个 post 返回,只需检查会话中是否已经有一个值。

示例代码:

protected void Page_Load(object sender, EventArgs e)
{
    // If this is the initial page load (not a post back), 
    // or if there's not already an end time in Session, 
    // then set the end time
    if (!Page.IsPostBack || Session["end_t"] == null)
    {
        DateTime start_time = DateTime.Now;
        DateTime end_time = start_time.AddMinutes(3);
        Session["end_t"] = end_time;
    }
}