ASP计时器阻止UI?

时间:2019-03-29 16:11:28

标签: c# asp.net telerik

我有一个相当简单的asp.net页面,其中包含几个按钮和文本框等,其可见性根据查询结果进行切换。一切正常。但是我收到了一个嵌入时钟的请求,该时钟可以连续显示服务器时间(这实际上是一个时钟网络应用程序)。我已经在线上关注了一些教程和示例,无论我做什么,计时器似乎都阻止了诸如按钮单击事件或文本框可见性之类的事情。

例如,我在另一个SO线程上找到了这个

    <fo:table width="100%" xsl:use-attribute-sets="section border_red">
            <fo:table-header>
                <fo:table-cell>
                    <fo:block xsl:use-attribute-sets="header">Product:
                    </fo:block>
                </fo:table-cell>
            </fo:table-header>
            <fo:table-footer>
                <fo:table-row>
                    <fo:table-cell>
                        <fo:block text-align="end">
                        <fo:retrieve-table-marker
                            retrieve-class-name="test123"
                            retrieve-boundary-within-table="table"
                            retrieve-position-within-table="last-ending"
                            />
                        </fo:block>
                    </fo:table-cell>
                </fo:table-row>
            </fo:table-footer>
            <fo:table-body>
                <xsl:for-each select="ROWSET2/ROWSET2_ROW">
                    <fo:table-row>
                        <fo:table-cell>
                            <fo:block xsl:use-attribute-sets="paragraph indented">
                                <xsl:choose>
                                    <xsl:when test="position() = 1">
                                        <fo:marker marker-class-name="test123">                                        
                                            <fo:inline>To be continued...</fo:inline>
                                        </fo:marker>
                                    </xsl:when>
                                    <xsl:when test="position() = last()">
                                        <fo:marker marker-class-name="test123"/>
                                    </xsl:when>
                                </xsl:choose>
                                <xsl:value-of select="PRODUCTNAME" />
                                <xsl:if test="position()=last()">
                                    <fo:inline>Last..</fo:inline>
                                </xsl:if>
                            </fo:block>
                        </fo:table-cell>
                    </fo:table-row>
                </xsl:for-each>
            </fo:table-body>
        </fo:table> 

并插入我的标签,该标签在内容模板中显示了时间,并在tick事件中对其进行了更新。效果很好,除了阻止了我的UI。

Telerik演示直接进行了最近的尝试: https://demos.telerik.com/aspnet-ajax/ajaxmanager/application-scenarios/ajaxify-timer/defaultcs.aspx

计时器本身可以正常工作,只是干扰了我的用户界面,这是一个问题。

编辑以添加页面标记:

 
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional"> 
    <Triggers>
        <asp:AsyncPostBackTrigger  ControlID="Timer1" EventName="Tick" />
    </Triggers>
    <ContentTemplate> 
        <!-- your content here, no timer -->
    </ContentTemplate> 
</asp:UpdatePanel> 

<asp:Timer ID="Timer1" runat="server" Interval="5000" OnTick="Timer1_Tick">
</asp:Timer> 

1 个答案:

答案 0 :(得分:1)

您可以按照以下步骤解决此问题:

1。。确保没有隐藏的脚本错误。有时,脚本错误会导致UI控件停止运行。 Details

2。。AJAX的好处是部分更新。确保计时器仅更新页面的相关部分,例如标签,没别的。

3。。如果您在<head>标记中包含脚本,请在脚本管理器定义之后将它们转移到<body>

4。。将计时器包装在asp:Panel中,然后使用此面板。另外,您可以添加面板进行自我更新:

        <telerik:RadAjaxManager ID="RadAjaxManager1" runat="server">
            <AjaxSettings>
                <telerik:AjaxSetting AjaxControlID="Panel1">
                    <UpdatedControls>
                        <telerik:AjaxUpdatedControl ControlID="Panel1" />
                        <telerik:AjaxUpdatedControl ControlID="Label1" />
                    </UpdatedControls>
                </telerik:AjaxSetting>
            </AjaxSettings>
        </telerik:RadAjaxManager>
        <asp:Panel ID="Panel1" runat="server">
            <asp:Timer ID="Timer1" runat="server" Interval="2000" OnTick="Timer1_Tick"></asp:Timer>
        </asp:Panel>
        <asp:Label ID="Label1" runat="server" Text="Output"></asp:Label>
    protected void Timer1_Tick(object sender, EventArgs e)
    {
        Label1.Text = DateTime.Now.ToLongTimeString() + "." + DateTime.Now.Millisecond;
    }

5。有用的提示-如果用户已经在页面上滚动了某个位置,并且此时发生了AJAX请求,则滚动位置将重置并自动滚动到页面顶部。为防止这种情况,您可以使用以下方法:Source

<script type="text/javascript">
    var prm = Sys.WebForms.PageRequestManager.getInstance();

    prm.add_beginRequest(function() {
        prm._scrollPosition = null;
    });
</script>

6。。如果在代码后部动态添加了自定义脚本,则可以检查Demo 1Demo 2以查看如何在AJAX请求后重新创建这些脚本。

7。。将脚本内容包装在RadScriptBlock中。