Verständnis Problemm: WeakReference und Event!



  • Ich hab folgenden Konstrukt:

    Button target=...;
    var weakReference = new WeakReference(target);
    ((Button)weakReference.Target).Click += WeakReference_Click;
    

    Ich habe ein Button Object (WPF) als schwache Reference!

    Zyklich prüfe ich ab ob der Button noch reference irgendwo hat (weakReference.Target !=NULL)

    Wenn ich nun das Control verwerfe , in dem der Button drin ist, wird irgendwann
    "weakReference.Target" auch NULL!
    Aber das passiert auch , wenn der Button noch registriere Click events hat!? Wieso?

    Dürfte de Reference nicht erst null werden, wenn auch keine Event mehr an dem Button hängen!?



  • NullBockException schrieb:

    Wenn ich nun das Control verwerfe , in dem der Button drin ist, wird irgendwann
    "weakReference.Target" auch NULL!
    Aber das passiert auch , wenn der Button noch registriere Click events hat!? Wieso?

    Dürfte de Reference nicht erst null werden, wenn auch keine Event mehr an dem Button hängen!?

    Nö, du hast das falsch rum.
    Der Event gehört dem Button, und wenn du dich in den Event reinhängst, dann hält der Butten den Event-Receiver am Leben.
    Umgekehrt aber nicht - der Button kann also jederzeit vom GC eingesammelt werden. Natürlich erst wenn er in keinem Fenster mehr drinhängt - und dann kann er ja auch nimmer geklickt werden.

    Also nochmal genauer:
    Der Button referenziert den aktuellen Delegate des Events
    Der Delegate referenziert den Event-Receiver



  • Hmm Danke,

    aber is es nich soo, dass ein Objekt erst dann zerstört werden kann, wenn es keine angehängten Events mehr hat? Typische .NT MemoryLeak Ursache!? Oder hab ich da jetzt nen Denkfehler drine?;)



  • NullBockException schrieb:

    Oder hab ich da jetzt nen Denkfehler drine?;)

    Ja.
    Denk es nochmal durch.

    1. Der Sender hält den Empfänger am Leben. Umgekehrt nicht.
    2. (Mal abgesehen von statischen Membervariablen etc.) Nur ein Objekt das selbst durch irgendwas am Leben gehalten wird kann ein anderes Objekt am Leben halten.

Anmelden zum Antworten