我有一个间隔为1000(1秒)的计时器。 计时器正在执行SQL查询,并将结果作为一个数字放在label.text。
中当我向上和向下滚动页面时出现问题。滚动时我会滞后并卡住。 如果我将间隔改为10(只是出于好奇),滞后是巨大的! 感谢您的帮助。
这是我的HTML脚本:
<div>
<asp:Timer ID="Timer1" runat="server" Interval="10000" ontick="Timer1_Tick">
</asp:Timer>
</div>
<asp:UpdatePanel ID="UpdatePanel5" runat="server" UpdateMode="Always">
<triggers>
<asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />
</triggers>
<contenttemplate>
<asp:Label ID="Label1" class="button2" runat="server"></asp:Label>
</contenttemplate>
</asp:UpdatePanel>
CS:
protected void Timer1_Tick(object sender, EventArgs e)
{
con.Open();
cmd = new SqlCommand("exec time_proc1", con);
dr = cmd.ExecuteReader();
while (dr.Read())
{
Label1.Text = dr["seconds"].ToString();
}
答案 0 :(得分:1)
每当计时器滴答发生时,它都会回发到Web服务器。我怀疑它正在等待服务器在继续之前做出响应。因此,如果您每秒都运行一次,那么每秒钟您都在进行回发并等待服务器响应。这肯定会导致一些不平滑的滚动。
当您将计时器间隔更改为10时,会使计时器每10毫秒或每秒100次触发。它实际上可能实际上不会每秒发送100个回发(我希望不会),但它几乎肯定在得到前一个回复后立即发出新请求。因此,浏览器不会有太多时间来获取输入和滚动。
您遇到的问题是AJAX开始流行的一个原因。它使异步请求在很大程度上不会干扰UI响应。如果您想要定期更新和流畅的UI操作,则必须考虑使该定时器(或类似的东西)执行异步请求。
不幸的是,我不是那个向你展示如何做到的人。我对ASP.NET控件的体验是......过时了。
答案 1 :(得分:1)
现在看来,你的代码每隔10秒(10,000毫秒)同步(POST)工作!
你应该不需要每次回发刷新整个页面,我建议你将你的代码转换为异步工作,以避免非常糟糕的滚动体验。
请查看来自MSDN的这个精彩教程:How to refresh an UpdatePanel control at a timed interval
为了方便:
代码隐藏
protected void Timer1_Tick(object sender, EventArgs e)
{
Label1.Text = "Panel refreshed at: " + DateTime.Now.ToLongTimeString();
}
ASP.NET
<form id="form1" runat="server">
<asp:ScriptManager runat="server" id="ScriptManager1">
</asp:ScriptManager>
<asp:UpdatePanel runat="server" id="UpdatePanel1">
<ContentTemplate>
<asp:Timer runat="server" id="Timer1" Interval="10000" OnTick="Timer1_Tick"> </asp:Timer>
<asp:Label runat="server" Text="Page not refreshed yet." id="Label1">
</asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<asp:Label runat="server" Text="Label" id="Label2"></asp:Label>
</form>
答案 2 :(得分:0)
所以我用iframe完成它,定时器代码在不同的页面,现在没问题。