0

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

        }
4

3 回答 3

1

每当该计时器滴答发生时,它就会回传到 Web 服务器。我怀疑它正在等待服务器响应,然后再继续。因此,如果您每秒都在运行它,那么您每秒都在进行回发并等待服务器响应。这肯定会导致一些不平滑的滚动。

当您将计时器间隔更改为 10 时,这会使计时器每 10 毫秒触发一次,或每秒触发 100 次。它实际上可能不会每秒执行 100 次回发(我希望不会),但它几乎肯定会在收到前一个请求的响应后立即发出一个新请求。因此浏览器不会有太多时间来获取您的输入和滚动。

您遇到的问题是 AJAX 流行的原因之一。它发出的异步请求在很大程度上不会干扰 UI 响应。如果您想要定期更新和流畅的 UI 操作,您将不得不考虑让该计时器(或类似的东西)执行异步请求。

不幸的是,我不是向您展示如何做到这一点的人。我对 ASP.NET 控件的体验是……过时了。

于 2013-10-04T21:21:08.070 回答
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>
于 2013-10-04T21:33:02.107 回答
0

所以我只是用 iframe 完成了它,计时器代码在不同的页面中,现在没问题。

于 2013-10-05T11:15:04.077 回答