Non sono sicuro di essere completamente chiaro sulle implicazioni del collegamento agli eventi negli oggetti.In quali casi è necessario staccare gli eventi?
Questa è la mia attuale comprensione, corretto o elaborato:
1. Collegamento ad eventi di livello locale non hanno bisogno di essere distaccato
Esempi:
this.Closing += new System.ComponentModel.CancelEventHandler(MainWindow_Closing);
public event EventHandler OnMyCustomEvent = delegate { };
Presumo che quando il tuo ob ject è disposto o garbage collection, le funzioni sono deallocate e si disconnetterebbero automaticamente dagli eventi.
2. Collegamento a oggetti non più necessari (= null;) devono essere separate da
Esempi: Allegare all'evento trascorso di un timer, che si risponde solo per una volta. Suppongo che sia necessario memorizzare il timer in una variabile locale in modo da poter staccare l'evento trascorso dopo l'attivazione dell'evento. Così, dichiarando il timer in un ambito metodo locale in questo modo si tradurrebbe in una perdita:
System.Timers.Timer myDataTimer = new System.Timers.Timer(1000); myDataTimer.Elapsed += new System.Timers.ElapsedEventHandler(myDataTimer_Elapsed);
3. Collegamento a eventi in un oggetto locale per la vostra classe non richiede lo smaltimento?
Ad esempio, se si dispone di una ObservableCollection che crea, monitora e lascia morire. Se ci si è collegati all'evento CollectionChanged utilizzando una funzione locale privata, questa funzione non sarebbe stata deallocata quando la classe è stata sottoposta a garbage collection, facendo sì che anche ObservableCollection venisse liberato?
Sono sicuro di avere punti in cui ho smesso di usare oggetti e non sono riuscito a staccarmi da un evento (ad esempio, l'esempio del timer che ho creato), quindi sto cercando una spiegazione più chiara su come funziona .
Hai perfettamente ragione, sto complicando le cose. Cercando degli esempi, quasi tutti hanno mostrato di staccarsi dall'evento, il che mi ha portato a credere che l'abbonato potesse mantenere vivo l'editore. –
Domanda stupida: questo implica che se il publisher si iscrive a un evento nel Sottoscrittore, allora nessuno dei due può/sarà raccolto? –
No, significa che c'è un riferimento circolare - non appena non ci sono * altri riferimenti * radicati a uno di essi, entrambi saranno idonei per GC. –