我在我的网页中使用了带有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>
</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());
}
}
确定
答案 0 :(得分:0)
我猜您在页面开头的某处设置了Session
变量,可能在Page_Load
中。之后,需要一些时间来构造页面或执行一些数据库语句。之后它执行定时器代码,你已经有一段时间了。
您还应该知道在.NET中使用任何类型的Timer
并不是100%可靠。问题是计时器暂停到后台,处理器做了其他一些事情。在至少间隔时间(通常稍长一些)之后,计时器恢复并继续执行。这意味着你的代码总会有延迟。
这意味着可能会根据您的计时器假设进行错误计算。可能是计时器的第一次ping回已经发生,并且由于计算四舍五入,你已经超过了2秒。
作为旁注:解析一次整数,这肯定会使您的代码更容易阅读。此外,由于重复计算,即使声明中的时间也可能不同。
答案 1 :(得分:0)
在您的情况下,延迟可能有两个可能的原因。
为了避免由场景#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
。如果不检查整页,我就无法告诉它。但是,如果您要向页面添加最少的控件并对代码进行一些最小的工作,这一点不应该给您带来麻烦。
如果上述内容修复了您的问题,请尝试通知我。
希望这有帮助。