在我的表单中,有一个“提交按钮”和另一个计时器...“提交”按钮提交的请求可能要花几分钟的时间。.这意味着计时器将以较短的时间间隔(例如5秒)轮询并保持用户更新..但是问题是,一旦单击Submit按钮,计时器将立即停止轮询。.我将附加应用程序的工作示例代码。.有谁知道为什么会这样。

<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   ");
        }

最佳答案

我认为计时器在回发时停止(单击按钮),并且仅在该回发返回时才重新启动。一种解决方案是使用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>


使用网络方法时,请不要忘记设置EnablePageMethods =“ true”!

在测试时,我注意到响应速度比SetTimeout触发新的Ajax调用慢,因此该页面迅速建立了正在运行的连接,这可能是因为我的开发服务器有点慢。要解决此问题,您不应该如此频繁地更新,而是每5秒钟执行一次。

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

10-05 20:49
查看更多