当另一个请求被提供时,Ajax计时器不轮询

时间:2011-08-01 07:35:31

标签: c# .net asp.net ajax updatepanel

在我的表格中有一个“提交按钮”和另一个计时器...提交按钮提交一个请求,可能需要几分钟才能服务...同时计时器将以短间隔(比如5秒)轮询并保持用户更新..但问题是,一旦点击提交按钮,计时器就会停止轮询。我正在附上应用程序的工作示例代码。有人知道为什么会发生这种情况。谢谢提前。

<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <div>
        <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
            <ContentTemplate>
                <div>
                    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Submit_Click" />
                </div>
            </ContentTemplate>
        </asp:UpdatePanel>
    </div>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
        <ContentTemplate>
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
        </ContentTemplate>
        <Triggers>
            <asp:AsyncPostBackTrigger  ControlID="Timer1" EventName="Tick" />
        </Triggers>
    </asp:UpdatePanel>
    <asp:Timer ID="Timer1" Interval="700" runat="server" OnTick="UpdateTimer_Tick">
    </asp:Timer>
    </form>
</body>

背后的代码

  protected void UpdateTimer_Tick(object sender, EventArgs e)
        {
            Debug.Write("Timer");
            Label1.Text = DateTime.Now.ToString();
        }

        protected void Submit_Click(object sender, EventArgs e)
        {
            Debug.Write("Submit Start ");
            for (int i = 0; i < 1000; i++)
            {
                Thread.Sleep(100);
            }
            Debug.Write("Submit  End   ");
        } 

1 个答案:

答案 0 :(得分:3)

我认为计时器在回发时停止(按钮单击),并且只有在该回发返回时才会再次启动。对此的一个解决方案是使用PageMethods而不是计时器,但您只能将静态函数设为PageMethod。对于示例,它将像这样工作:

[WebMethod()] public static string GetTime(){
    Return DateTime.Now.ToString();
}

html和javascript(jquery):

<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true">
</asp:ScriptManager>
<div>
    <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode="Conditional">
        <ContentTemplate>
            <div>
                <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Submit_Click" />
            </div>
        </ContentTemplate>
    </asp:UpdatePanel>
</div>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

<script type="text/javascript">
    function OnSuccess(result, ctrl) { $('#<%=Label1.ClientID %>').html(result); }
    function OnError() { alert("error!"); }
    $(document).ready(function() {
        setInterval(function() { PageMethods.GetTime(OnSuccess, OnError); }, 700)
    });
</script>

</form>
</body>

使用webmethods时不要忘记设置EnablePageMethods =“true”!

在测试时我注意到响应比SetTimeout触发新的ajax调用慢,所以页面快速建立运行连接,这可能是因为我的开发服务器有点慢。要解决这个问题,你不应该频繁更新,每5秒就要做一次。

我想asp.net计时器已经阻止了这种行为:它在另一个ajax调用完成时停止。此行为会导致您遇到的问题,按钮回发会阻止计时器更新。