ASP.NET DataList.DataBind()导致CPU增加

时间:2015-03-07 19:01:23

标签: c# asp.net data-binding

我在一个有一个DataList项的页面中有一个UserControl,当我对该项进行DataBind调用时,CPU的峰值大约为15-20%。因此,每次刷新页面时,CPU使用率都会增加,直到达到90%以上的高位。

我相信它是在下面显示的那条线上,因为当我发表评论时它并没有发生,当我取消注释时它会发生(这是一致的)。

dataListControl.DataBind();

此外,当我减少从查询返回的记录数量(通过使用top)时,没有问题。查询非常简单,如下所示。

SELECT top 25 *
    FROM Questions Q 
    WHERE isBold=1
    ORDER BY 
    Question

没有涉及线程(除了asp.net对事物的处理)。所以只是一个调用db并返回DataTable的page_load方法,然后绑定到控件,如上所示。

没有自定义的OnItemDataBound事件,因此在绑定DataList时不会运行其他代码。

此外,在使用较小的结果集(前25名)调试页面时,我逐步完成代码,一切看起来都很好。后:

dataListControl.DataBind();

它进入.ascx页面并在那里循环遍历数据列表然后上传链(webform,masterpage)。

页面总是返回。因此,对于更大的结果集,页面实际上会加载,我可以做其他的事情。我可以点击重定向到同一页面的链接,同样的事情发生:页面加载和CPU使用率再次飙升15-20%。

幸运的是,这不会在制作中发生。但是,在本地开发时,我必须每隔几分钟手动终止进程,因为笔记本电脑会大幅减速。我该如何解决这个问题?

编辑:添加Datalist

<asp:DataList ID="questionDataList" runat="server" Width="100%" OnItemCommand="questionDataList_ItemCommand">
    <ItemTemplate>
        <table width="90%">
            <tr>
                <td width="70%">
                    <asp:CheckBox ID="questionCheckbox" CssClass="FormLabel" runat="server" Text='<%# Eval("isBold")!=DBNull.Value?(Eval("isBold").ToString()=="True")?"<b>" +Eval("Question")+"</b>":Eval("Question"):Eval("Question")%>' />
                    <asp:HiddenField runat="server" ID="questionIDHiddenField" Value='<%#Eval("Id") %>'
                        Visible="false" />
                </td>
                <td width="15%">
                    <asp:LinkButton ID="questionDeleteLinkButton" runat="server" CssClass="FormLabel"
                        CommandName="Delete" CommandArgument='<%#Eval("Id") %>' Text="Delete" OnClientClick="return confirm('Are you sure want to delete this Question?');"></asp:LinkButton>
                </td>
                <td width="15%">
                    <asp:CheckBox ID="isQuestionBoldCheckBox" CssClass="FormLabel" runat="server" Text="Mark Bold"
                        Checked='<%#Eval("isBold").ToString()=="True"%>' OnCheckedChanged="isQuestionBoldCheckBox_CheckedChanged"
                        AutoPostBack="true"></asp:CheckBox>
                </td>
            </tr>
        </table>
    </ItemTemplate>
</asp:DataList>

编辑2: 这个编辑被删除,因为事实证明它不是真的。

编辑3:

我把DataList放在一个页面本身做同样的事情。我也把它改成了转发器,我得到了同样的东西。所以它与它在UC中没有任何关系。 Codebehind如下所示。

当我运行存储过程时,没有尖峰。

我尝试在DataList级别禁用viewstate,在页面级别它仍然存在于html源代码中。不确定我是否需要禁用任何其他级别。

刚看到这个:ViewStateMode Disabled but still getting ViewState element

protected void Page_Load(object sender, EventArgs e)
{
    question.questionID = 0;
    question.isBold = 1;
    question.question = "";

    Repeater2.DataSource = GetQuestions(question);
    Repeater2.DataBind();
}

public DataTable GetQuestions(Question question)
{
    dtContainer = new DataTable();
    try
    {
        common.SetDBProcedureName("getQuestions");
        MyParameter[] myParameter =
        {
            new MyParameter("@isBold", question.isBold),
            new MyParameter("@searchText", question.strQuestion)
        };

        common.SetProcedureParameter(myParameter);
        common.Procedure_Execute(dtContainer);
    }
    catch (Exception ex)
    {
        ErrorReporting.DataLayerError(ex);
    }
    return dtContainer;
}

编辑4:当我在转发器中更改如下所示的表格内容时,没有问题。

<asp:Repeater ID="Repeater2" runat="server" EnableViewState="false">
    <ItemTemplate>
        <table width="90%">
                <td width="70%">
                    <%#Eval("Id") %>   <%#Eval("isBold").ToString()=="True"%>
                </td>
            </tr>
            <asp:Repeater ID="Repeater1" runat="server"></asp:Repeater>
        </table>
    </ItemTemplate>
</asp:Repeater>

当我按如下所示添加此行时,会出现问题,但实际上最终会出现问题。大约需要10秒钟。所以它可能与viewstate有关,因为当我在下面添加额外的行时,viewstate会变得更大。我一直在添加行,直到我得到原始数据列表,它实际上在30-40秒之后下降。当我刷新页面几次时,它会达到50%左右,持续半分钟左右。原始数据列表在一个页面中,我猜其他服务器控件也是如此,因此需要更长时间(超过一分钟)才能使峰值下降。

那么即使在提供页面后,页面的哪个部分或哪个进程仍在后台运行?我该如何解决这个问题。我不认为只需要一个200行的桌子就可以花20秒钟。

<asp:Repeater ID="Repeater2" runat="server" EnableViewState="false">
    <ItemTemplate>
        <table width="90%">
            <td width="70%">
                 <%#Eval("Id") %>      <%#Eval("isBold").ToString()=="True"%>
                </td>
            </tr>
            <asp:Repeater ID="Repeater1" runat="server"></asp:Repeater>
        </table>
    </ItemTemplate>
</asp:Repeater>

0 个答案:

没有答案