我在项目中插入了一个倒数计时器。当我运行它时,计时器启动但是当我停止调试它并且在我再次运行它之后的一段时间然后我注意到的是,计时器仍在运行。例如,我给了计时器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>
&#13;
答案 0 :(得分:1)
说计时器仍然正在运行有点误导。退出调试后,实际上没有任何代码在运行。 但,将开始时间存储在会话状态,默认情况下,该状态存储在浏览器中。如果您停止调试然后重新开始,则会重新启动您的网络应用的应用实例,但浏览器会保留会话状态。所以你的浏览器仍然有旧的开始时间。因此,在页面加载时,行if (Session["end_t"] == null)
会导致 false 。那里是值。
这里有很多选项,但如果不回发,则可以始终清除页面加载的值。如果 回发帖,只需检查会话中是否有值。
示例代码:
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;
}
}