una pattern para net implementar implement example definicion contiene .net resources native idisposable

.net - pattern - object no contiene una definicion para dispose



¿Cuál es la diferencia entre los recursos administrados y los nativos al deshacerse?(.RED) (3)

Un recurso gestionado es otro tipo gestionado, que implementa IDisposable . IDisposable llamar a Dispose() en cualquier otro tipo de IDisposable que use. Los recursos nativos son cualquier cosa fuera del mundo administrado, como los controladores nativos de Windows, etc.

EDIT : respuesta a la pregunta en el comentario (demasiado tiempo para hacer comentarios)

No, eso es solo un tipo administrado. Un tipo de construcción correcta, que no implementa IDisposable será manejado por el recolector de basura y no tiene que hacer nada más. Si su tipo utiliza un recurso nativo directamente (por ejemplo, llamando a bibliotecas Win32), debe implementar IDisposable en su tipo y disponer de los recursos en el método Dispose . Si su tipo utiliza un recurso nativo encapsulado por otro tipo que implementa IDisposable , debe llamar a Dispose() en las instancias de este tipo en el método Dispose de su tipo.

Estaba leyendo el artículo de MSDN sobre cómo implementar IDisposable y no estoy seguro de la diferencia entre los recursos administrados y nativos citados en el artículo.

Tengo una clase que debe disponer de 2 de sus campos cuando se desecha. ¿Debería tratarlos como Gestionados (disponer solo cuando se deshace = verdadero) o recursos Nativos?


La respuesta breve sería cualquier cosa que vaya detrás de la espalda del CLR (al sistema operativo) para obtener se puede denominar como '' nativo ''.

  • asignación de memoria no administrada. Si ''nuevo'' sube un trozo de memoria en una clase administrada CantStayManaged, entonces CantStayManaged es responsable de liberar esta memoria (recurso).
  • maneja archivos, tuberías, eventos, construcciones de sincronización, etc. - como regla general si llama a WinAPIs para obtener punteros / identificadores a un recurso, entonces esos son ''recursos nativos''

Entonces, CantStayManaged tiene 2 cosas que necesita para limpiar antes de decir adiós.

  1. Administrado: campos de miembros y cualquier recurso asignado por CLR. Esto generalmente equivale a llamar a Dispose en sus objetos miembros ''Desechables''.
  2. No administrado: todas las cosas furtivas de bajo nivel que ponemos detrás de su espalda.

Hay 2 formas en que se puede activar la limpieza de objeto ahora.

  1. Dispose (verdadero) caso: Has llamado a Dispose explícitamente en tu tipo. Buen programador.
  2. Dispose (false) case: Olvidaste llamar a Dispose, en cuyo caso el finalizador debería activarse y garantizar una limpieza adecuada.

En ambos casos, los recursos no administrados deberían liberarse; de ​​lo contrario, ¡''LEAKS!'', ''CRASHES!'' et.all superficie. Pero solo debe intentar limpiar los recursos administrados solo en el caso anterior Dispose (). En el último caso / finalizador, el CLR podría haber finalizado y recopilado algunos de sus miembros, por lo que no debe acceder a ellos (CLR no garantiza un orden en el que finalice un gráfico de objetos). De ahí que evite problemas al proteger su limpieza administrada con un if (AmIBeingCalledFromDispose)

HTH


Para agregar un poco a la respuesta de Brian, y su comentario / pregunta:

La diferencia entre un recurso gestionado / no gestionado es que Garbage Collector conoce los recursos gestionados y no conoce los recursos no gestionados. Sé que la respuesta no es muy concreta, pero la diferencia es enorme.

Para ayudar a dibujar la línea en la arena aquí está la versión corta (y probablemente plagada de pequeños errores) de cómo funciona GC y limpia la memoria:

El recolector de basura está al tanto de todos los objetos administrados, pero cuando se ejecuta la recolección de elementos no utilizados, inicialmente no sabe si un objeto dado todavía está en uso o si es elegible para ser liberado. Determina si puede o no limpiar un objeto marcando inicialmente todos los objetos como basura y luego atravesando desde la raíz de la aplicación hasta todos los objetos a los que se hace referencia. Cada objeto que tiene una relación con la raíz (una referencia, ya sea directa o indirecta) se marca como alcanzable y ya no se considera basura. Después de que el GC recorre todos los objetos alcanzables, limpia el resto ya que no están en uso.

En casi todos los casos que trabaje con objetos de .NET Framework, puede estar seguro de que los objetos se administran (.NET proporciona contenedores administrados de casi todos los recursos no administrados para garantizar que se limpien adecuadamente); otros componentes de terceros que se conectan a la API de Win32 (o sus componentes que hacen esto) son los objetos que pueden ser motivo de preocupación.

Hay algunos objetos .NET que pueden considerarse algo no administrados. Los componentes de la biblioteca de gráficos son un ejemplo.

La mayoría de las "fugas de memoria .NET" no son realmente fugas de memoria en el verdadero sentido. Por lo general, ocurren cuando cree que ha eliminado un objeto del uso, pero de hecho el objeto todavía tiene alguna referencia a la aplicación. Un ejemplo común es agregar eventhandlers (obj.SomeEvent + = OnSomeEvent -o bien - AddHandler obj.SomeEvent, AddressOf OnSomeEvent) y no eliminarlos.

Estas ''referencias persistentes'' técnicamente no son pérdidas de memoria ya que su aplicación todavía las está usando técnicamente; sin embargo, si hay suficientes, su aplicación puede sufrir graves impactos en el rendimiento y puede mostrar signos de problemas de recursos (OutOfMemoryExceptions, no puede obtener identificadores de ventanas, etc.).

Soy un desarrollador intermedio de .NET y, desafortunadamente, conozco estos problemas de primera mano. Recomiendo jugar con ANTS Profiler para familiarizarse con las referencias persistentes (hay una versión de prueba gratuita) o si quieres obtener un poco más de investigación con WinDbg y SOS.DLL para ver el montón administrado. Si decides ver lo último, te recomiendo leer el blog de Tess Ferrandez; ella tiene una gran cantidad de excelentes tutoriales y consejos sobre el uso de Windbg de manera efectiva