2011-09-15 24 views
6

Si siempre necesito llamar a RemoveHandler después de usar AddHandler, ¿cuál es el mejor lugar para hacerlo?En vb.net, si uso AddHandler, ¿Tengo que usar RemoveHandler?

He buscado varias preguntas similares de la siguiente manera, pero no entiendo muy bien.

When and where to call the RemoveHandler in VB.NET?

AddHandler/RemoveHandler Not Disposing Correctly

pensé recolección de basura en C# o vb.net se hará cargo de los objetos no utilizados. Además, en vb.net designer, genera automáticamente Dispose Sub. Así que no presté atención al recurso de liberación programática en absoluto. ¿Tendré problemas de pérdida de memoria? Por favor amablemente bríndenos algunos enlaces/documentos para que yo pueda comenzar a aprender.

Protected Overrides Sub Dispose(ByVal disposing As Boolean) 
    Try 
     If disposing AndAlso components IsNot Nothing Then 
      components.Dispose() 
     End If 
    Finally 
     MyBase.Dispose(disposing) 
    End Try 
End Sub 

Gracias mucho!

+0

Tendrá que publicar el contexto en el que está usando AddHandler. – CommonSense

Respuesta

10

Si siempre que llamar RemoveHandler después de usar AddHandler, donde es el mejor lugar para hacerlo

Usted no necesariamente tiene que hacer esto.

Por lo general, solo tiene que preocuparse por llamar a RemoveHandler si su objeto de origen (el del evento) va a sobrevivir a su suscriptor. Si está trabajando dentro de un Formulario, el formulario que se está eliminando evitará que la fuente lo plantee más, y ambos objetos estarán fuera del alcance y (eventualmente) obtendrán la basura recolectada, por lo que no tendrá ningún problema.

Este problema surge más si se está suscribiendo a un evento en un objeto de larga vida de algún otro objeto que se "irá" antes que el objeto de larga vida. Esto puede causar una pérdida de memoria, incluso con el recolector de basura. En ese caso, querrá llamar a RemoveHandler cuando haya terminado de escuchar el evento. Sin embargo, no hay una guía única para cuando esto debería suceder, ya que depende del evento en cuestión y la lógica de la aplicación.

Cuestiones relacionadas