我正在开发一个Web应用程序,我需要一个倒计时器。我正在使用asp.net
asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Label ID="lblHour" Text="" runat="server"></asp:Label>
<asp:Label ID="lblMin" Text="" runat="server"></asp:Label>
<asp:Label ID="lblSec" Text="" runat="server"></asp:Label>
<asp:Timer ID="Timer1" runat="server" Interval="1000" ontick="timer_Tick">
</asp:Timer>
</ContentTemplate>
</asp:UpdatePanel>
背后的代码
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session["time"] = DateTime.Now.AddSeconds(40);
}
}
protected void timer_Tick(object sender, EventArgs e)
{
TimeSpan time1 = new TimeSpan();
time1 = (DateTime)Session["time"] - DateTime.Now;
if (time1.Seconds <= 0)
{
lblSec.Text = "TimeOut!";
}
else
{
lblSec.Text = time1.Seconds.ToString();
}
}
我遇到的问题是,计时器不会正常减少。它从38开始,然后到35然后是32,依此类推。
有没有办法解决这个问题?
答案 0 :(得分:1)
我认为这里的问题是,当计时器被触发时,它执行代码的时间会稍长一秒,1秒+一些微秒,这就是这个输出的原因。在您的代码中测试它。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Session["time"] = DateTime.Now.AddSeconds(40);
}
}
protected void timer_Tick(object sender, EventArgs e)
{
var endTime = (DateTime) Session["time"];
var endMin = ((DateTime)Session["time"]).Minute;
var endSec = ((DateTime)Session["time"]).Second;
var endMsec = ((DateTime)Session["time"]).Millisecond;
var currentTime = DateTime.Now;
var currentMin = currentTime.Minute;
var currentSec = currentTime.Second;
var currentMsec = currentTime.Millisecond;
var time1 = endTime - currentTime;
lblHour.Text = string.Format("End Sec - {0}:{1}:{2}", endMin, endSec, endMsec);
lblMin.Text = string.Format("Current Sec - {0}:{1}:{2}", currentMin, currentSec, currentMsec);
lblSec.Text = time1.Seconds <= 0 ? "TimeOut!" : time1.Seconds.ToString();
}