Duda acerca de dispose y recursos unmanaged

23/03/2005 - 09:15 por olopeich | Informe spam
Epa!

Tengo una duda con el metodo dispose y en general con toda la
parafernalia mutante esta de los finalizes, disposes y tal.

Segun tengo entendido el gc en accion cuando lo considera oportuno y
llama al metodo finalize del objeto en cuestion para terminarlo.
Entiendo entonces q todos los recursos supervisados por la plataforma
son liberados. El tema viene de una clase q estoy haciendo q lleva
acceso a base de datos y segun tengo entendido ese tipo de recurso no es
supervisado, con lo que al destruirlo hay q liberarlo. Leyendo en la
ayuda del studio veo un ejemplo de como implementar un metodo dispose y
me surge la duda. Primero el codigo

Public Class MiClase
Implements IDisposable

'aqui el metodo dispose sobrecargado
Public Overloads Sub Dispose()Implements IDisposable.Dispose
'llama la dispose de mas abajo
Dispose(true)
'esto es para retirar al obejto de la lista de limpieza del gc
GC.SuppressFinalize(Me)
End Sub

'dispose con 1 booleano: si true limpia todo, si false solo los recursos
unmanaged
Protected Overloads Overridable Sub Dispose(disposing As Boolean)
' Check to see if Dispose has already been called.
If Not (Me.disposed) Then
' If disposing equals true, dispose all managed
' and unmanaged resources.
If (disposing) Then
' Dispose managed resources.
Components.Dispose()
End If
' Release unmanaged resources. If disposing is false,
' only the following code is executed.
'(codigo para liberar unmanaged)
End If
Me.disposed = true
End Sub

Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub


Biueno, lo q no entiendo es el porque del dispose (boolean) y distinguir
la liberacion de recursos supervisados y no supervisados. Y porque en el
finalize hace un dispose(false) osea, solo libera el unmanaged en vez
liberarlo todo (en la ayuda pone 'porque no se puede' :? y se quedan tan
panchos)

Muchas gracias y un saludo

Preguntas similare

Leer las respuestas

#1 Guillermo guille
23/03/2005 - 11:20 | Informe spam
esto del Dispose es mu bonito... y mu modelno... pero si lo que de verdad
quieres hacer es librerar los recursos que tengas... crea un método en el que
se liberen y "procura" llamarlo en cuanto ya no los necesites... así te ahorras
calentamientos de cabeza.

Lo del Dispose es para que si "se te olvida" llamar a ese método, el .NET lo
hará por tí, por tanto en el método Dispose(disposing As Boolean) deberías
llamar a ese método liberador de recursos, o mejor aún poner ahí el código y
desde ese método llamar al Dispose(True)


Nos vemos.
Guillermo
Microsoft VB MVP desde 1997
Te invito a mi sitio dedicado al VB y más...
http://www.elguille.info/
http://www.mundoprogramacion.com/
(puede que el correo usado sea anti-spam)


"olopeich" wrote in message
news:
Epa!

Tengo una duda con el metodo dispose y en general con toda la parafernalia
mutante esta de los finalizes, disposes y tal.

Segun tengo entendido el gc en accion cuando lo considera oportuno y llama al
metodo finalize del objeto en cuestion para terminarlo. Entiendo entonces q
todos los recursos supervisados por la plataforma son liberados. El tema
viene de una clase q estoy haciendo q lleva acceso a base de datos y segun
tengo entendido ese tipo de recurso no es supervisado, con lo que al
destruirlo hay q liberarlo. Leyendo en la ayuda del studio veo un ejemplo de
como implementar un metodo dispose y me surge la duda. Primero el codigo

Public Class MiClase
Implements IDisposable

'aqui el metodo dispose sobrecargado
Public Overloads Sub Dispose()Implements IDisposable.Dispose
'llama la dispose de mas abajo
Dispose(true)
'esto es para retirar al obejto de la lista de limpieza del gc
GC.SuppressFinalize(Me)
End Sub

'dispose con 1 booleano: si true limpia todo, si false solo los recursos
unmanaged
Protected Overloads Overridable Sub Dispose(disposing As Boolean)
' Check to see if Dispose has already been called.
If Not (Me.disposed) Then
' If disposing equals true, dispose all managed
' and unmanaged resources.
If (disposing) Then
' Dispose managed resources.
Components.Dispose()
End If
' Release unmanaged resources. If disposing is false,
' only the following code is executed.
'(codigo para liberar unmanaged)
End If
Me.disposed = true
End Sub

Protected Overrides Sub Finalize()
Dispose(False)
MyBase.Finalize()
End Sub


Biueno, lo q no entiendo es el porque del dispose (boolean) y distinguir la
liberacion de recursos supervisados y no supervisados. Y porque en el
finalize hace un dispose(false) osea, solo libera el unmanaged en vez
liberarlo todo (en la ayuda pone 'porque no se puede' :? y se quedan tan
panchos)

Muchas gracias y un saludo
Respuesta Responder a este mensaje
#2 Eduardo A. Morcillo [MS MVP VB]
23/03/2005 - 13:36 | Informe spam
El porque del disposing es para no acceder a los objetos manejados. Si
accedes a ellos, estos no puede ser removidos por el GC. Al usar este flag
te aseguras que eso no ocurra y que todo pueda eliminarse sin problemas.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida