Таймер Ajax не опрашивает, когда обслуживается другой запрос - PullRequest
3 голосов
/ 01 августа 2011

В моей форме есть кнопка «Отправить» и еще один таймер ... Кнопка «Отправить» отправляет запрос, который может занять несколько минут. Значит, в то время как таймер будет опрашивать с короткими интервалами (скажем, 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 Ответ

3 голосов
/ 01 августа 2011

Я думаю, что таймер останавливается при обратной передаче (нажатие кнопки) и будет запускаться снова только после возврата этой обратной передачи. Одним из решений этой проблемы является использование 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. Такое поведение вызывает проблему, которую вы испытываете, кнопка обратной передачи блокирует обновления таймера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...