1

再帰を使用して階層を構築します。

この再帰は、Windows Server 2003 + IIS6では正常に機能しますが、Windows Server2008R2およびIIS7.0では例外がスローされます。

コードスニペットは次のとおりです。

Public Sub Expand(ByVal SE_Index As Int64)

    Dim row As DataRow

    If aryHierarchyData(SE_Index).Visable = True Then
        aryHierarchyData(SE_Index).Target_Row = gvCurrent_Row_Number
        gvCurrent_Row_Number = gvCurrent_Row_Number + 1

        Try
            row = dtExpand.NewRow
            row("SE_NO") = aryHierarchyData(SE_Index).SE_No
            row("Selection_Index") = aryHierarchyData(SE_Index).Selection_Index
            **dtExpand.Rows.Add(row)**--->>>throwing error "stackoverflow"

        Catch ex As StackOverflowException
            If (ex.Message.Contains("Column 'SE_NO, Selection_Index' is constrained to  be unique.")) Then
                Exit Sub
            End If

        Catch ex As Exception

        Finally
            row = Nothing
        End Try

        ' expand this SE's children  -  first
        If aryHierarchyData(SE_Index).Child > 0 Then
            Expand(aryHierarchyData(SE_Index).Child)
        End If
    End If

    ' expand this SE's Siblings  -  second

    If aryHierarchyData(SE_Index).Sibling > 0 Then
        Expand(aryHierarchyData(SE_Index).Sibling)
    End If

End Sub
4

2 に答える 2

0

この例外は、コンピュータのメモリとフレームワークによって異なります。IISやWindowsサーバーとは何の関係もありません。

ネストされたメソッド呼び出しが多すぎるために実行スタックがオーバーフローしたときにスローされる例外。このクラスは継承できません。MSDN

いくつかの変更を加えてコードを試しました。私は私の経験に応じて上記のステートメントを変更します

Framework 4.0 7573のネストされたメソッド呼び出しが含まれているために、実行スタックがオーバーフローしたときにスローされる例外。このクラスは継承できません。

Framework 2.0 7038のネストされたメソッド呼び出しが含まれているために、実行スタックがオーバーフローしたときにスローされる例外。このクラスは継承できません。

于 2012-11-30T15:02:34.443 に答える
0
Stackoverflow problem could be solved using thread.
Call expand() under recursivethread function.

Private Sub RecurseThread(totalSeCount As Long)
 For iIdx = 1 To totalSeCount
    If aryHierarchyData(iIdx).Target_Row = 0 Then
    dtExpand.Clear()
    dtExpand.AcceptChanges()
    Expand(iIdx)
  End If
Next iIdx
End Sub

Dim t As Thread = New Thread(AddressOf RecurseThread, 1024 * 1024)
t.Start(totalSeCount)
t.Join()
于 2012-12-07T07:45:35.727 に答える