使用更新面板加载页面时延迟计时器标签显示
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>
</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 造成的延迟,您将在您实际上是 运行 计时器的页面上设置超时会话。
注意:您必须在 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
。如果不检查您的整个页面,我将无法告诉它。但是,如果您要向页面添加最少的控件并且对后台代码做一些最少的工作,这一点应该不会给您带来麻烦。
如果以上方法解决了您的问题,请尝试并告诉我。
希望对您有所帮助。
我在我的网页中使用了带有 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>
</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 造成的延迟,您将在您实际上是 运行 计时器的页面上设置超时会话。
注意:您必须在 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
。如果不检查您的整个页面,我将无法告诉它。但是,如果您要向页面添加最少的控件并且对后台代码做一些最少的工作,这一点应该不会给您带来麻烦。
如果以上方法解决了您的问题,请尝试并告诉我。
希望对您有所帮助。