Asp.net定时器控制延迟

时间:2013-10-04 21:08:05

标签: c# asp.net .net timer

我有一个间隔为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();

        }

3 个答案:

答案 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完成它,定时器代码在不同的页面,现在没问题。