Re: Garbage Collection und Event Handler

Tech-Archive recommends: Repair Windows Errors & Optimize Windows Performance



> Auch wieder falsch verstanden. Ein Objekt empfängt keine events, sondern
> löst sie aus, auch wenn es auf das Objekt keine Referenzen mehr gibt. Wenn
> natürlich ein EventHandler eine Methodes eines Objektes aufruft, dann gibt
> es einen Verweis und da Objekt wird durch den GC nicht entsorgt. Ohne
> Verweis kan auch keine Methode aufgerufen werde. Umgekhert kann aber ohne
> Verweis auf ein Objekt dieses Object selbst Ereignisse auslösen. Falls dich
> ein Beispiel dazu interssiert, dann kann ich das gern beritstellen.

OK da habe ich wohl die Satzstellung etwas falsch gelesen. Das
"verwaiste" Objekte bis zur Ihrer Zerstörung durch den GC noch Events
auslösen ist klar.


> Und wo finde ich dein kleines Testprogramm?

Ich war auch kurz am Zweifeln, aber es ist als Attachment an mein
voheriges Posing dranhehängt. Ich schreibe es aber hier unten nochmal
als Klartext.

> Was ist ein zestörtes Objekt? Es gibt zerstörte Objektverweise. Das Objekt
> selbst bleibt dabei unberührt und wird erst durch den GC vollständig
> vernichtet (gelöscht). Solange das Object auch Ereignisse empfangen kann,
> d.h. solange Methoden des Objektes aufgerufen werden können, gibt es Bezüge
> auf dieses Objekt und der GC entsorgt es nicht. Eine Besonderheit sind
> weiche Referenzen (weak reference).

Ein "vermutlich zerstörtes Objekt" meinte ich. Also ich setze eine
Referenz = nothing und denke das dieses Objekt doch bald dem GC
zum Opfer fällt. Tut es auch es sei denn dieses Objekt ist per
AddHandler zu einem Event-Consumer geworden. Dann bleibt es als
"nicht referenzierbarer Speicherfresser" im RAM. Ich kann jedenfalls
nicht mehr bewusst auf dieses Objekt zugreifen. Das war ja auch die
Situation weshalb ich hier um Rat gesucht habe. Genau dies zeigt mein
Beispiel.


grüße
-nico

Hier isses nun:
----------------------------------------
Module Module1
Sub Main()
Dim p As New publisher
Dim c As New Consumer

Dim i As Integer

AddHandler p.Publish, AddressOf c.GotSomethingPublished


While True
p.PublishSomething()
System.Threading.Thread.CurrentThread.Sleep(1000)

If i = 3 Then c = Nothing
i += 1
GC.Collect
End While
End Sub


Class publisher
Public Event Publish()

Public Sub PublishSomething()
RaiseEvent Publish()
End Sub
End Class

Class Consumer
Public Sub GotSomethingPublished()
Console.WriteLine("got something")
End Sub
Protected Overrides Sub Finalize()
Console.WriteLine("i should be finalized")
MyBase.Finalize()
End Sub
End Class

End Module


.



Relevant Pages

  • Re: Wegen des Eventhandlers für ein Formereignis darin
    ... Liegt das an dem Verweis auf die ... Public Class Form1 ... Private Sub Form1_LoadHandles Me.Load ... End Sub ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Verweis auf PDFCreator erzeugen
    ... Es gibt noch etwas besseres als den Verweis zur Laufzeit einbinden. ... Dim pdfApp As PDFCreator.clsPDFCreator ... #End If ... With Dialogs ...
    (microsoft.public.de.word.vba)
  • Re: Bitmap aus Zwischenablage lesen
    ... > Ich will ein Bitmap aus der System-Zwischenablage in mein ... Imports System.Drawing ... End Function ... Private Class BITMAPFILEHEADER ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: VB.NET vs. C#
    ... beide Sprachen haben ihre Vor und Nachteile ... schneller zu tippen als endIf end for etc. ... > public class Foo: Goo, IBaz, IBla ... > Dim a As Byte = ... ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • ayuda con asignacion de objetos
    ... TLista = class ... constructor NewLista; {Crea una nueva lista vacia y retorna ... PNodo); ...
    (borland.public.delphi.non-technical)