Re: Garbage Collection und Event Handler
- From: "Nico Balen" <nospam>
- Date: Thu, 3 Nov 2005 08:53:56 +0100
> 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
.
- Follow-Ups:
- Re: Garbage Collection und Event Handler
- From: Peter Fleischer
- Re: Garbage Collection und Event Handler
- References:
- Garbage Collection und Event Handler
- From: Nico Balen
- Re: Garbage Collection und Event Handler
- From: Peter Fleischer
- Re: Garbage Collection und Event Handler
- From: Peter Fleischer
- Garbage Collection und Event Handler
- Prev by Date: Re: NumericUpDown
- Next by Date: Re: Garbage Collection und Event Handler
- Previous by thread: Re: Garbage Collection und Event Handler
- Next by thread: Re: Garbage Collection und Event Handler
- Index(es):
Relevant Pages
|