AJAX asp.net中的计时器问题

时间:2011-03-17 08:46:02

标签: asp.net ajax

我正在开发一个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,依此类推。

有没有办法解决这个问题?

1 个答案:

答案 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();
    }