使用更新面板加载页面时显示延迟计时器标签

时间:2015-06-01 06:26:45

标签: c# asp.net timer

我在我的网页中使用了带有updatepanel的C#计时器,一切运行良好,除了在页面加载时我的计时器标签在3秒后显示,即:3点钟,计时器显示为2:57秒。

那怎么解决呢。提前谢谢....

我的aspx代码是:

<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" Font-Bold="True" Font-Names="Arial" Font-Size="X-Large" ForeColor="#6600CC"></asp:Label>&nbsp;&nbsp;
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="timer1" EventName ="tick" />
        </Triggers>
    </asp:UpdatePanel>
</div>

我的asp.cs代码是:

if (0 > DateTime.Compare(DateTime.Now, DateTime.Parse(Session["timeout"].ToString())))
{
    string seconds = ((Int32)DateTime.Parse(Session["timeout"].ToString()).Subtract(DateTime.Now).Seconds).ToString();
    if (Convert.ToInt32(seconds) < 10)
    {
        lblTimer.Text = string.Format("Time Left: 00:0{00}:0{01}", ((Int32)DateTime.Parse(Session["timeout"].ToString()).Subtract(DateTime.Now).TotalMinutes).ToString(),
            ((Int32)DateTime.Parse(Session["timeout"].ToString()).Subtract(DateTime.Now).Seconds).ToString());
    }
    else
    {
        lblTimer.Text = string.Format("Time Left: 00:0{00}:{01}",
            ((Int32)DateTime.Parse(Session["timeout"].ToString()).Subtract(DateTime.Now).TotalMinutes).ToString(),
            ((Int32)DateTime.Parse(Session["timeout"].ToString()).Subtract(DateTime.Now).Seconds).ToString());
    }
}

确定

2 个答案:

答案 0 :(得分:0)

我猜您在页面开头的某处设置了Session变量,可能在Page_Load中。之后,需要一些时间来构造页面或执行一些数据库语句。之后它执行定时器代码,你已经有一段时间了。

您还应该知道在.NET中使用任何类型的Timer并不是100%可靠。问题是计时器暂停到后台,处理器做了其他一些事情。在至少间隔时间(通常稍长一些)之后,计时器恢复并继续执行。这意味着你的代码总会有延迟。

这意味着可能会根据您的计时器假设进行错误计算。可能是计时器的第一次ping回已经发生,并且由于计算四舍五入,你已经超过了2秒。

作为旁注:解析一次整数,这肯定会使您的代码更容易阅读。此外,由于重复计算,即使声明中的时间也可能不同。

答案 1 :(得分:0)

在您的情况下,延迟可能有两个可能的原因。

  1. 页面重定向
  2. 页面加载
  3. 为了避免由场景#1引起的延迟,您将在实际运行计时器的页面上设置超时会话。

    注意:您必须设置Page_Load并确保PostBack不会加载页面。

    所以,代码块将是:

    protected void Page_Load(object sender, EventArgs e)
    {
        if(!IsPostBack)
            SetTimeout();
    }
    
    public void SetTimeout() {
        int secondsAhead = 30;
        Session["timeout"] = DateTime.Now.AddSeconds(secondsAhead).ToString();
    }
    

    对于方案#2,您必须在其他地方另外致电SetTimeout。如果不检查整页,我就无法告诉它。但是,如果您要向页面添加最少的控件并对代码进行一些最小的工作,这一点不应该给您带来麻烦。

    如果上述内容修复了您的问题,请尝试通知我。

    希望这有帮助。