Lambda Eventhandler deregistrieren!?



  • Morgen Jungs,

    wenn ich in einer Klasse im Konstruktor sowas mache:

    _someInstance.SomeEvent += (s, e) => { ... bla .... };
    

    und die Instance der Klasse zerstört wird , hab ich dann ein Memoryleak?

    Grüßle



  • Nein.



  • Ok cool.. und wieso nicht? was passiert da intern?



  • Die Antwort war ein bißchen spitzfindig. Wenn deine Instanz "zerstört" wird, also: vom GC eingesammelt, und wenn die Lambdafunktion die Instanz referenziert hat, dann muß der GC auch schon _someInstance eingesammelt haben, weil es ja sonst noch eine Referenz auf deine Instanz gegeben hätte. Also kein Leck. (Natürlich könnte es sein, daß die Lambdafunktion lokale Variablen referenziert, nicht aber deine Instanz; dann wäre meine verkürzte Antwort unzutreffend.)

    Was du in Wahrheit wissen willst, ist, ob du Speicherlecks verursachen kannst, wenn du Event-Handler nicht wieder entfernst. Ja, das kannst du grundsätzlich schon, aber es kommt eben immer drauf an, und wenn du keine globalen Referenzen auf die involvierten Objekte hast, macht es oft keinen Unterschied. Sowas ähnliches hatten wir kürzlich hier, da kannst du auch ein paar Details nachlesen.

    Daß man Event-Handler wieder entfernt, hat jedenfalls meist mit Correctness zu tun, nicht mit Speicherlecks.



  • Ok danke :)) 👍 👍



  • Es kann Leaks verursachen.

    Was ich aber viel schlimmer finde, ist, dass durch das nicht-Entfernen der Handler die Handler auch wirklich immer noch aufgerufen werden.
    So lange also das von _someInstance Referenzierte Objekt existiert, wird SomeEvent immer noch dein Objekt benachrichtigen - auch wenn dein Objekt schon lange nicht mehr gebraucht wird. Was u.A. zu Performance-Problemen führen kann, und im schlimmsten Fall auch zu unerwünschtem Verhalten. Je nachdem was dein SomeEvent Handler halt tut.

    @audacia
    War es das was du mit "Correctness" gemeint hast?



  • hustbaer schrieb:

    @audacia
    War es das was du mit "Correctness" gemeint hast?

    Ja.



  • Genau,

    ich habe es dann im endeffekt in der correctness form gemacht:)

    Konstrutkor

    _someInstance.SomeEvent += DoSomeThing;
    

    und

    _someInstance.SomeEvent -= DoSomeThing
    

    via IDisposable


Log in to reply