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

Late timer label display while page loading using update panel

我在我的网页中使用了带有 updatepanel 的 C# 计时器,一切正常,除了在页面加载期间我的计时器标签在 3 秒后显示,即:3:00 分钟计时器显示为 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());
    }
}

还行

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

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

这意味着根据您的计时器假设也可能出现错误计算。可能计时器的第一个 ping-back 已经发生,并且由于计算四舍五入,你已经关闭了 2+ 秒。

附带说明:解析您的整数一次,这肯定会使您的代码更易于阅读。另外,由于重复计算,甚至语句中的时间也可能不同。

对于您的情况,延迟可能有两种可能的原因。

  1. 页面重定向
  2. 页面加载

为了避免场景 #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。如果不检查您的整个页面,我将无法告诉它。但是,如果您要向页面添加最少的控件并且对后台代码做一些最少的工作,这一点应该不会给您带来麻烦。

如果以上方法解决了您的问题,请尝试并告诉我。

希望对您有所帮助。