Speicher wächst trotz Dispose

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von der_Kurt.

    Speicher wächst trotz Dispose

    Hallo,
    Ich habe eine kleine DigitalUhr gebastelt.
    Ich habe aber das Problem, dass der Speicher trotz der Anweisung Dispose wächst.
    Hier mal der Code:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    2. Panel2.BackgroundImage = DrawClock()
    3. End Sub
    4. Private Function DrawClock() As Bitmap
    5. _bitmap = New Bitmap(Panel2.Width, Panel2.Height)
    6. Using g = Graphics.FromImage(_bitmap)
    7. Dim rect As New Rectangle(0, 0, _bitmap.Width, _bitmap.Height)
    8. Dim fill As New LinearGradientBrush(rect, Color.White, Color.LightGray, LinearGradientMode.Vertical)
    9. g.FillRectangle(fill, rect)
    10. g.DrawString(Now.ToString, New Font("Verdana", 12, FontStyle.Regular), Brushes.White, 9, 9)
    11. g.DrawString(Now.ToString, New Font("Verdana", 12, FontStyle.Regular), Brushes.BlueViolet, 8, 8)
    12. g.Dispose()
    13. End Using
    14. Return _bitmap
    15. _bitmap.Dispose()
    16. End Function


    Hätte da jemand eine Idee, wie ich das Problem bewältigen kann?

    Danke im Voraus

    MfG GTW
    Code nach Return wird nicht mehr ausgeführt.
    Und selbst wenn du das Bitmap vor dem Return disposen würdest, wäre der Rückgabe-Wert unbrauchbar.
    Eine Bitmap disposest du dann, wenn du sie nicht mehr brauchst.
    Ein Panel hat einen Paint-Event. Dies ist schon mal ein guter Ort, zu beginnen.
    Ich bin kein Verfechter der Function Drawclock, da hier eine function keinen Mehrwert hat (ausser du benötigst die gezeichnete Bitmap noch in einem anderen Zusammenhang.

    Deshalb: Zeichnen im Paint-Event, im Timer höchstens das Neuzeichnen des Panels erzwingen, nicht eine weitere Zuweisung machen (Zeile 2).

    Ich hab das Beispiel mal umgeschrieben (geht sicher noch besser).
    Das Objekt g benötige ich gar nicht, da ich nicht auf einem Graphics-Objekt zeichne, welches zuvor durch eine Bitmap erzeugt wurde, sondern auf den Graphics-Objekt, welches mir die Parameter im Paint-Event zurückgeben. ("e.Graphics"). Dafür setze ich "Fill" in den Using-Block.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick
    2. Panel2.Invalidate()
    3. End Sub
    4. Private Sub Panel2_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) Handles Panel2.Paint
    5. Using fill As New LinearGradientBrush(e.Graphics.ClipBounds, Color.White, Color.LightGray, LinearGradientMode.Vertical)
    6. e.Graphics.FillRectangle(fill, e.Graphics.ClipBounds)
    7. e.Graphics.DrawString(Now.ToString, New Font("Verdana", 12, FontStyle.Regular), Brushes.White, 9, 9)
    8. e.Graphics.DrawString(Now.ToString, New Font("Verdana", 12, FontStyle.Regular), Brushes.BlueViolet, 8, 8)
    9. End Using
    10. End Sub

    Wie gesagt - geht sicher noch besser (zB muss man die Font-Objekte nicht immer neu erzeugen, ...)
    Weitere Gedanken... muss die Uhr immer weiterlaufen, oder ist dein Programm auch mal in Hintergrund? (Eine Uhr, die ich nicht sehe, muss nicht immer aktualisiert werden.)