抛出System.OutOfMemoryException

时间:2010-06-22 08:48:29

标签: asp.net memory-leaks loops out-of-memory nested-repeater

我的代码中出现了system.outofmemory异常:

While r1.Read()
                    menu1id = r1("id")
                    db.AddInParameter(command2, "@menu1id", DbType.Int32, menu1id)
                    r2 = db.ExecuteReader(command2)
                    command2.Parameters.Clear()
                    menu1heading = r1("Heading")
                    If r1("url") IsNot Nothing And r1("moduleid") = 0 Then
                        url = r1("url").ToString

                        If InStr(url, "file:///") > 0 Then
                            Dim builder As New StringBuilder
                            builder.Append("<a href=")
                            builder.Append(r1("url"))
                            builder.Append(" target=")
                            builder.Append(r1("urltarget"))
                            builder.Append(">")
                            builder.Append(menu1heading)
                            builder.Append("</a>")
                            level1.Add(builder.ToString)
                        Else
                            Dim builder As New StringBuilder
                            builder.Append("<a href=http://")
                            builder.Append(r1("url"))
                            builder.Append(" target=")
                            builder.Append(r1("urltarget"))
                            builder.Append(">")
                            builder.Append(menu1heading)
                            builder.Append("</a>")
                            level1.Add(builder.ToString)
                        End If
                    Else
                        Dim builder As New StringBuilder
                        builder.Append("<a href=~/Default.aspx?id=")
                        builder.Append(r1("id"))
                        builder.Append(">")
                        builder.Append(menu1heading)
                        builder.Append("</a>")
                        level1.Add(builder.ToString)
                    End If


                    While r2.Read
                        menu2id = r2("id")
                        db.AddInParameter(command3, "@menu2id", DbType.Int32, menu2id)
                        r3 = db.ExecuteReader(command3)
                        command3.Parameters.Clear()
                        menu2heading = r2("Heading")

                        If r2("url") IsNot Nothing And r2("moduleid") = 0 Then
                            Dim builder As New StringBuilder
                            builder.Append("<a href=http://")
                            builder.Append(r2("url"))
                            builder.Append(" target=")
                            builder.Append(r2("urltarget"))
                            builder.Append(menu2heading)
                            builder.Append("</a>")
                            level2.Add(builder.ToString)
                        Else
                            Dim builder As New StringBuilder
                            builder.Append("<a href=~/Default.aspx?id=")
                            builder.Append(r2("id"))
                            builder.Append(">")
                            builder.Append(menu2heading)
                            builder.Append("</a>")
                            level2.Add(builder.ToString)
                        End If


                        While r3.Read
                            menu3heading = r3("Heading")
                            menu3id = r3("id")
                            If r3("url") IsNot Nothing And r3("moduleid") = 0 Then
                                Dim builder As New StringBuilder
                                builder.Append("<a href=http://")
                                builder.Append(r3("url"))
                                builder.Append(" target=")
                                builder.Append(r3("urltarget"))
                                builder.Append(">")
                                builder.Append(menu3heading)
                                builder.Append("</a>")
                                level3.Add(builder.ToString)
                            Else
                                Dim builder As New StringBuilder
                                builder.Append("<a href=~/Default.aspx?id=")
                                builder.Append(r3("id"))
                                builder.Append(">")
                                builder.Append(menu3heading)
                                builder.Append("</a>")
                                level3.Add(builder.ToString)
                            End If

                        End While

                        r3.Close()
                    End While

                    r2.Close()
                End While

                r1.Close()
            End While
            r0.Close()

请告诉我如何诊断和修复此例外情况?非常感谢。

2 个答案:

答案 0 :(得分:4)

该方法使用了大量的字符串连接,每个字符串连接都会创建大量新的临时字符串对象,从而耗尽堆空间。使用StringBuilder创建连接字符串可以避免这种情况。 StringBuilder在连接大量字符串时不仅可以提高内存效率,而且速度也会快得多:

Dim builder As New StringBuilder()
builder.Append("<a href=")
builder.Append("r0("url"))
builder.Append("target=")
builder.Append(r0("urltarget"))
builder.Append(menu0heading)
builder.Append("</a>")

Dim str as String
str = builder.ToString()

注意:正如David Neale在评论中指出的那样,在这种情况下,最好使用TagBuilder(或XmlWriter)来创建HTML / XML文档树。

答案 1 :(得分:4)

将逻辑更改为单个sql查询会更好,一次性返回所有菜单项,然后迭代此数据集以构建菜单。

你可以试试

SELECT id, DepartmentID, GroupingID, Heading, OrderID, 
Publish, moduleid, url, urltarget
FROM Grouping 
WHERE (DepartmentID = 0 AND Publish <> 0)
ORDER BY OrderID

这将返回上述查询返回的所有数据,包括确定树结构的GroupingID。您应该能够将结果加载到对象集合中,然后使用LINQ查询它们以构建菜单。

将您的数据复制到以下类中,然后在列表中使用LINQ:

public class DataClass
{
public string Id { get; set; }
public string DepartmentID { get; set; }
public string GroupingID { get; set; }
public string Heading { get; set; }
public string OrderID { get; set; }
public string Publish { get; set; }
public string Moduleid { get; set; }
public string Url { get; set; }
public string Urltarget { get; set; }

public List<DataClass> Children { get; set; }

public DataClass(string id, string departmentID, string groupingID, string heading, string orderID, string publish, string moduleid, string url, string urltarget)
{
    Id = id;
    DepartmentID = departmentID; 
    GroupingID = groupingID;
    Heading = heading;
    OrderID = orderID; 
    Publish = publish;
    Moduleid = moduleid;
    Url = url;
    Urltarget = urltarget;
}
}
相关问题