Tun event-Handler stop garbage collection verhindert?
Wenn ich den folgenden code:
MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass = null;
Wird pClass werden, Müll gesammelt? Oder wird es hängen, um noch feuern Ereignisse, wenn Sie auftreten? Brauche ich, um Folgendes zu tun, damit die garbage-collection?
MyClass pClass = new MyClass();
pClass.MyEvent += MyFunction;
pClass.MyEvent -= MyFunction;
pClass = null;
Ich werde unter VORBEHALT zu empfehlen für Leser interessiert in dieser Frage, dass es sich lohnen könnte, vertraut mit leichten events / weak event patterns, die NICHT zu verhindern garbage collection verhindert. Gut SO-bootstrap dieses Thema stackoverflow.com/questions/185931/...
Hinweis für die Nachwelt: beim setzen der Referenz auf null, einfach Verzögerungen der garbage collector durch die Erweiterung durch eine Linie der Umfang der Referenz. .NET ist nicht VB6.
Hinweis für die Nachwelt: beim setzen der Referenz auf null, einfach Verzögerungen der garbage collector durch die Erweiterung durch eine Linie der Umfang der Referenz. .NET ist nicht VB6.
InformationsquelleAutor Mark Ingram | 2008-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für die konkrete Frage "Wird pClass werden, Müll gesammelt": die Ereignis-Abonnement hat keine Auswirkungen auf die Sammlung von pClass (als Herausgeber).
Für die GC im Allgemeinen (insbesondere das target): es hängt davon ab, ob MyFunction statisch oder Instanz-basiert.
Delegierter (wie ein Ereignis-Abonnement) auf eine Instanz-Methode enthält einen Verweis auf die Instanz. Also ja, ein Ereignis-Abonnement wird verhindern, dass GC. Jedoch, sobald das Objekt der Veröffentlichung einer Veranstaltung (pClass oben) ist berechtigt, für die Sammlung, ist dies kein problem.
Beachten Sie, dass diese one-way; D. H. wenn wir haben:
dann "publisher" halten "Ziel" lebt, aber "Ziel" nicht zu halten "publisher" lebendig.
Also Nein: wenn pClass gesammelt sowieso, gibt es keine Notwendigkeit zu kündigen, wird der Zuhörer. Allerdings, wenn pClass war lange gelebt (länger als die Instanz mit MyFunction), dann pClass halten konnte, dass die Instanz am Leben, so ist es würde notwendig sein, abbestellen, wenn Sie möchten, dass die Gegner gesammelt werden.
Statische Ereignisse, aber aus diesem Grund, sind sehr gefährlich, wenn verwendet mit Instanz-basierten Handler.
fair genug - ich werde es klären
Obwohl ein Ereignis-Abonnement Delegierten lediglich eine Möglichkeit, einen Abonnenten, die hat die Absicht der Abmeldung von einer Veranstaltung wenn Sie fertig sind mit es müssen in irgendeiner form einen Verweis auf die publisher. Es könnte ein
WeakReference
, und in einigen Fällen, dass könnte eine gute Idee sein, aber so oft wie nicht, es wird eine starke.Eine tolle Antwort, da es auch Adressen, die andere Hälfte der Frage (das war nicht gefragt): die publisher beendet den subscriber von GC würde.
Ja, und wie @BobSammers sagte, Es könnte wirklich ein problem werden, wenn eine short-life-Beispiel, wie ein Formular/Fenster, ist das abonnieren eines long-life-service wie ein Singleton, liefert Daten für das Beispiel : das Singleton-dann hält die Referenz-und die Objekte sind thefore im Speicher gehalten, auch wenn wir denken, Sie sind entladen ! So seien Sie sehr vorsichtig bei der Verwendung von Events. Wir missbraucht mit Veranstaltungen für unsere großen software, und es ist sehr schwer zu lösen danach.
InformationsquelleAutor Marc Gravell
Ja, pClass wird Müll gesammelt. Die Ereignis-Abonnement bedeutet nicht, dass jeder Verweis besteht zu pClass.
Einem also Nein, werden Sie nicht haben, trennen Sie die handler, um für pClass Abfall gesammelt.
InformationsquelleAutor Tor Haugen
Moment einen Speicherbereich nicht mehr referenziert wird, wird es ein Kandidat für die garbage collection. Wenn die Instanz der Klasse geht out of scope, es ist nicht mehr verwiesen wird, die von Ihrem Programm. Es wird nicht mehr verwendet und kann daher sicher erfasst werden.
Wenn Sie nicht sicher sind, ob etwas zusammengestellt bekommen werden Fragen Sie sich die folgende Frage: es existiert noch ein Verweis darauf? Der event-Handler verwiesen wird, die von der Objekt-Instanz, nicht die andere Weise herum.
InformationsquelleAutor lvaneenoo
pClass
wird Müll gesammelt. Wenn jedoch die code-Ausschnitt ist in einer anderen Klasse, die Instanz dieser Klasse kann nicht gelöscht werden, wenn Sie nichtpClass
zunull
.InformationsquelleAutor Arav