
Envoyé par
smyley
Surtout, surtout, ne jamais accéder à un objet managé qui n'est référencé nul part ailleurs un finalizer ou dans un Dispose appelé par le finalizer. C'est une règle.
En fait le GC fonctionne avec des graphs d'objets construits en fonction des référence.
Donc tu as un objet A qui est référencé par un objet B et C utilisé dans ton application. Si tu libères les références vers B et C alors lorsque le GC va passer il aura un graphe contenant les objets A, B et C. Et c'est tout ce qui est prévisible, l'ordre dans lequel les finalizers seront appelés sur A, B et C n'est pas prévisible (en général c'est linéaire mais il ne faut pas prendre cela pour une généralité).
Donc en terme de GC il se peut très bien qu'en essayant d'accéder à un objet managé dans un finalizer il se peut très bien que cet objet ai lui même déjà finalisé et donc les finalizers pourraient avoir un NullReferenceException, ObjectDisposedException ou autres bizarreries de ce genre.
Partager