Speicher wird immer voller. Dispose funktioniert nicht.

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Speicher wird immer voller. Dispose funktioniert nicht.

    Hallo zusammen.

    Hoffentlich könnt Ihr mir helfen.

    Ich erstelle zur Laufzeit Controls. Dieses Control wurde selbst erstellt.
    Dem Control füge ich einen AddHandler zu und adde es zu einem Parent. In dem Fall ein Pageview.

    Um das Control jetzt wieder zu zerstören durchsuche ich das Pageview und dispose das Control.
    Vorher entferne ich das Control mit remove vom Parent.
    Das ganze mache ich aus einer anderen Klasse heraus wie wo es erstellt wurde.

    1. Ich finde keine Vorgehensweise im Netz für das Problem.
    2. Wie setze ich den RemoveHandler richtig??
    3. Im Leistungsprofiler wird nach erzwingen GC der Speicher nicht frei geräumt.

    Wo ist mein Fehler? Wie finde ich noch weitere recourcen die auf das Control zugreifen.

    Gruß Udo
    Wenn Du einen Handler hinzufügst, dann solltest Du den wieder mit RemoveHandler entfernen. Im Falle von AddHandler A, AddressOf B ist es einfach: RemoveHandler A, AddressOf B. Im Falle von AddHandler A, Sub() B musst Du aus der Lambda-Methode eine normale Methode C machen und stattdessen AddressOf C verwenden (wieder jeweils mit AddHandler und RemoveHandler).
    Allgemein ist es schwierig solche Probleme zu diagnostizieren, wenn man den Code nicht vor sich hat. Aber es ist sehr unwahrscheinlich, dass das Problem von den Controls ansich kommt. Ich tippe eher darauf, dass Du unverwaltete Ressourcen rumhängen hast. Was sind verwaltete / nicht verwaltete Ressourcen
    Generell kann man sagen: Alles, was IDisposable implementiert, muss auch Dispoed werden. Wie gesagt: Ohne den Code zu sehen, ist es schwierig, das zu beurteilen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    grisu74 schrieb:

    Dem Control füge ich einen AddHandler zu und adde es zu einem Parent.
    Ist dieser Handler zufällig Shared?
    Remove mal den Handler vor dem Disposen.
    Verwendest Du unmanaged Ressources?
    Lass mal über Deinen Code ne CodeAnalyse laufen, wenn Dein Studio das anbietet.
    ====
    Ist Dein Dispose korrekt implementiert?
    msdn.microsoft.com/de-de/library/fs2xkftw(v=vs.110).aspx
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Hallo.

    Also leider komme ich nicht weiter.
    Hier mal mein Code.

    VB.NET-Quellcode

    1. Public Class Hauptmenue
    2. Private Sub cmdLaden_Click(sender As Object, e As EventArgs) Handles cmdLaden.Click
    3. Try
    4. Hauptmenue.logger = log4net.LogManager.GetLogger("Log4NetAssembly1")
    5. If New FileInfo(_functions.ConfigPathnameTabs()).Exists Then
    6. Dim _designer As FMSEditor
    7. _designer = Controls("ucFMSEditor")
    8. Dim xTB As New tabs
    9. Dim xRow As tabs.tabsRow
    10. Dim xSE As New settingsFMSStatuselement 'Statuselement
    11. Dim xSERow As settingsFMSStatuselement.settingsFMSStatelemRow
    12. Dim _FMSStatus As FMSStatuselement.FMSStatuselement
    13. Dim _FMSBeschreibung As FMSStatuselement.Beschreibungsbox
    14. Dim _pathTabs As String = _functions.ConfigPathnameTabs()
    15. xTB.ReadXml(_pathTabs, System.Data.XmlReadMode.IgnoreSchema)
    16. xSE.ReadXml(_functions.ConfigPathnameFMS(), System.Data.XmlReadMode.IgnoreSchema)
    17. If xTB._tabs.Rows.Count > 0 Then
    18. For i As Integer = 0 To xTB._tabs.Count - 1
    19. xRow = xTB._tabs.Rows(i)
    20. Dim page As New RadPageViewPage()
    21. 'If Not xRow.IsNull(xRow.ID) Then
    22. page.Text = xRow.Text
    23. page.AutoScroll = True
    24. 'End If
    25. _designer.rpvEditor.Pages.Add(page)
    26. _designer.rpvEditor.Refresh()
    27. Next i
    28. If xSE.settingsFMSStatelem.Rows.Count > 0 Then
    29. For k As Integer = 0 To xSE.settingsFMSStatelem.Rows.Count - 1
    30. xSERow = xSE.settingsFMSStatelem.Rows.Item(k)
    31. If xSERow.elementTyp = "fmsBezeichner" Then
    32. _FMSBeschreibung = New FMSStatuselement.Beschreibungsbox
    33. With _FMSBeschreibung
    34. .Parent = _designer.rpvEditor.Pages(Convert.ToInt32(xSERow.tabID))
    35. .Name = "fmsBezeichner" + k.ToString()
    36. ._beschreibung = xSERow.beschreibung 'der Text in der Beschreibungsbox
    37. .Location = New Point(Convert.ToInt32(xSERow.elementXpos), Convert.ToInt32(xSERow.elementYpos))
    38. .Parent.Controls.Add(_FMSBeschreibung)
    39. End With
    40. AddHandler _FMSBeschreibung.MouseDown, AddressOf Control_MouseDown
    41. AddHandler _FMSBeschreibung.MouseMove, AddressOf Control_MouseMove
    42. AddHandler _FMSBeschreibung.MouseUp, AddressOf Control_MousUp
    43. AddHandler _FMSBeschreibung.MouseLeave, AddressOf Control_MouseLeave
    44. AddHandler _FMSBeschreibung.MouseClick, AddressOf lblBeschreibung_Click
    45. End If
    46. If xSERow.elementTyp = "fmsStatuselement" Then
    47. _FMSStatus = New FMSStatuselement.FMSStatuselement
    48. With _FMSStatus
    49. .Parent = _designer.rpvEditor.Pages(Convert.ToInt32(xSERow.tabID))
    50. .ISSIkennung = xSERow.kennung
    51. .Name = "FmsStatuselement" + k.ToString()
    52. ._funkrufname = xSERow.funkrufname
    53. ._bezeichnung = xSERow.bezeichnung
    54. .Location = New Point(Convert.ToInt32(xSERow.elementXpos), Convert.ToInt32(xSERow.elementYpos))
    55. .Parent.Controls.Add(_FMSStatus)
    56. End With
    57. AddHandler _FMSStatus.MouseDown, AddressOf Control_MouseDown
    58. AddHandler _FMSStatus.MouseMove, AddressOf Control_MouseMove
    59. AddHandler _FMSStatus.MouseUp, AddressOf Control_MousUp
    60. AddHandler _FMSStatus.MouseLeave, AddressOf Control_MouseLeave
    61. AddHandler _FMSStatus.DoubleClick, AddressOf lblKennung_DoubleClick
    62. AddHandler _FMSStatus.MouseClick, (AddressOf lblFahrzeug_MouseClick)
    63. End If
    64. Next k
    65. End If
    66. End If
    67. xTB.Dispose()
    68. xSE.Dispose()
    69. Else
    70. MsgBox("Es wurde noch keine Vorlage gespeichert.", vbOKOnly, "Hinweis!")
    71. End If
    72. Catch ex As Exception
    73. Hauptmenue.logger.Error("cmdLaden_Click() - " & ex.Message)
    74. Hauptmenue.logger.Error("cmdLaden_Click() - " & ex.StackTrace)
    75. End Try
    76. End Sub
    77. End Class

    Hiermit erstelle ich die Controls.
    Die Daten hierfür hole ich aus einer XML.

    VB.NET-Quellcode

    1. Public Class FMSEditor
    2. rivate Sub rpvEditor_PageRemoving(sender As Object, e As RadPageViewCancelEventArgs) Handles rpvEditor.PageRemoving
    3. For Each _control In sender.selectedpage.controls
    4. If TypeOf _control Is FMSStatuselement.FMSStatuselement Then
    5. RemoveHandler _control.MouseDown, AddressOf Hauptmenue.Control_MouseDown
    6. RemoveHandler Hauptmenue._FMSStatus.MouseMove, AddressOf Hauptmenue.Control_MouseMove
    7. RemoveHandler Hauptmenue._FMSStatus.MouseUp, AddressOf Hauptmenue.Control_MousUp
    8. RemoveHandler Hauptmenue._FMSStatus.MouseLeave, AddressOf Hauptmenue.Control_MouseLeave
    9. RemoveHandler Hauptmenue._FMSStatus.MouseClick, AddressOf Hauptmenue.lblBeschreibung_Click
    10. RemoveHandler Hauptmenue._FMSStatus.DoubleClick, AddressOf Hauptmenue.lblKennung_DoubleClick
    11. sender.selectedpage.controls.remove(_control)
    12. _control.Dispose()
    13. End If
    14. If TypeOf _control Is FMSStatuselement.Beschreibungsbox Then
    15. 'AddHandler Hauptmenue._FMSBeschreibung.MouseDown, AddressOf Hauptmenue.Control_MouseDown
    16. 'AddHandler Hauptmenue._FMSBeschreibung.MouseMove, AddressOf Hauptmenue.Control_MouseMove
    17. 'AddHandler Hauptmenue._FMSBeschreibung.MouseUp, AddressOf Hauptmenue.Control_MousUp
    18. 'AddHandler Hauptmenue._FMSBeschreibung.MouseLeave, AddressOf Hauptmenue.Control_MouseLeave
    19. 'AddHandler Hauptmenue._FMSBeschreibung.MouseClick, AddressOf Hauptmenue.lblBeschreibung_Click
    20. sender.selectedpage.controls.remove(_control)
    21. _control.Dispose()
    22. End If
    23. Next
    24. End Sub
    25. End Class

    Und hier der Versuch es zu entfernen.

    Durch die 2 verschiedenen Klassen, weis ich nicht so genau wie ich den Handler entfernen soll.

    Gruß UDo
    @grisu74 Poste das bereinigte Projekt ohne Binaries und beschreibe, was zu tun ist, um Deinen Effekt zuu reproduzieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @grisu74 Es reicht ein Projektrumpf, der den Effekt reproduziert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!