我在一个有一个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>