Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Myrkjartan
Thema: Abmelden von EventHandlern in einem komplex Vernetzten Program
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

@MarsStein
Das habe ich tatsächlich nicht gewusst. Wenn ich das ganze so abändere, dass die (dann leere) Kopie des EventHandlers zurückgegeben wird, würde das funktionieren?

Thema: Abmelden von EventHandlern in einem komplex Vernetzten Program
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich bin bereits mit einem MemoryProfiler drüber gegangen, was mich am Ende auf die EventHandler gebracht hat.
Was meinst du mit 'vordefinierte Events' ?

Thema: Abmelden von EventHandlern in einem komplex Vernetzten Program
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

OK, dann bedanke ich mich erst einmal für die Hilfe und werde mich zunächst durch die 10.000 Klassen arbeiten die das Programm enthält und die MemoryLeaks auf diese Art stopfen. Mal sehen ob's hilft.

Thema: Abmelden von EventHandlern in einem komplex Vernetzten Program
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Also, wenn ich deine Vermutung richtig verstanden habe, dann ist es genau so.
Ich versuchwe mal, das verständlich zu beschreiben:
Klasse A (wpf) hat einen EventHandler X.
Klasse B,C,D und E benutzen Klasse A und registrieren eigene EventHandler auf X. Diese sind teils tatschlich deklarierte EventHandler, teils auch nur Lambda Ausdrücke.
Wenn das Fenster geschlossen wird, müssen alle auf X registrierten EventHandler gelöscht werden, da sonst Verweiße auf diese vorhanden sind, weshalb der GC A nicht wegräumt und dieses Element im Speicher bleibt bis das Program komplett geschlossen wird.
Deshalb war mein Plan dann beim Schließen A.ClearAllRegisteredHandler() auszuführen, was meines Verständnisses nach, genau das machst was du vorgeschlagen hast.

Zitat
In dem Fall wäre es das klügste, dass das Fenster alle diese EventHandler beim Schließen wieder entfernt

Habe ich das richtig Verstanden?

Thema: Abmelden von EventHandlern in einem komplex Vernetzten Program
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich bin mir nicht sicher was ich da mache....
Es ist aber so gedacht, dass immer alle EventHandler entfernt werden. Ich benutze diese Funktion nur dann, wenn ich das Fenster schließe, an welcher Stelle alle entfernt werden müssen.

Thema: Abmelden von EventHandlern in einem komplex Vernetzten Program
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo Comunity,
ich arbeite an einem sehr komplexen Program, das EventHandler benutzt um zwischen Klassen zu komunizieren. Vor mir waren schon dutzende von Programmieren an diesem Projekt zu Gange. Mir ist an einem Punkt aufgefallen, dass es sehr weitreichende MemoryLeaks gibt, was ich erst einmal darauf zurück geführt habe, dass Eventhandler miteinander Verknüpft werden und diee verknüpfungen dafür sorgen, dass der GC die Elemente mit diesen EventHandlern nicht wegräumt, da es noch Verweise gibt.
Da es aufgrund der Programstruktur kompliziert bis unmöglich ist die EventHandler zu deregistrieren, habe ich folgende Idee gehabt:
Ich habe eine Etension Methode geschrieben, die alle registrierten EventHandler entfernen soll. Diese sieht so aus:

public static void ClearAllRegisteredHandler(this EventHandler handler)
        {
            foreach (EventHandler eh in handler?.GetInvocationList() ?? new Delegate[0])
            {
                handler -= eh;
            }
        }

Da sich mein Verständnis für die inneren Zusammenhänge von EventHandlern doch eher in Grenzen hält, ist meine Frage schlicht diese:
Funktioniert das?