¿Cuáles son las reglas para liberar ArcObjects de la memoria en .NET?

13

¿Necesito liberar cada objeto? ¿Se maneja la gestión de la memoria por mí?

ArcEngine 10, VS2010 C #

    
pregunta patrick 17.02.2011 - 16:37

6 respuestas

17

Más notablemente, siempre libere explícitamente los cursores cuando haya terminado con ellos. También libero algunos objetos de enumeración que implican acceso a la base de datos, por ejemplo IEnumRelationship obtienes de IRelationshipClass.GetRelationshipsForObject .

Además, cuando creas una gran cantidad de instancias COM que son de corta duración (especialmente en bucles ajustados), también es una buena idea liberarlas explícitamente.

También hay escenarios en los que es recomendable publicar referencias de características individuales (fila). Por ejemplo, si crea una nueva versión de la geodatabase, edita los datos, reconcilia y publica, los intentos de eliminar la versión posteriormente pueden fallar, ya que puede haber filas inéditas, que a su vez mantienen la referencia a la versión (espacio de trabajo) que intenta eliminar. Sin embargo, la mayoría de estos escenarios son raros y no es necesario que los tenga en cuenta en su desarrollo diario de ArcObjects. Solo haría que el código estuviera desordenado con una limpieza extraña, lo que lo haría menos fácil de mantener.

También es importante decir cuándo no lanzar envoltorios .NET - nunca libera explícitamente RCW de ArcObjects que podría estar en uso por cualquier otro código administrado. Un ejemplo de esto: no libere IMap cuando esté en ArcMap. En general, no intente liberar ArcObjects que no haya creado.

    
respondido por el Petr Krebs 17.02.2011 - 19:59
6

En su mayor parte, la recolección de basura .NET funciona bien. Hay algunos casos en ArcObjects que realizan un trabajo importante en los descontroladores y la naturaleza no determinista de las envolturas .NET puede causar problemas. Este tema de ayuda cubre los casos principales que deben tratarse sobre y cómo gestionar las publicaciones.

    
respondido por el Craig Williams 17.02.2011 - 16:54
2

Siempre destruye:

  • cursores
  • IEnums

Ten cuidado de no destruir algo que está siendo usado en otro lugar.

Hoy leí un interesante debate en el sitio web de ESRI en el que participó Kirk. Hubo otras opiniones muy interesantes, como el uso del método ReleaseComObject y el FinalReleaseComObject (o algo parecido). Lo siento, no tengo el enlace en este momento.

Algunos incluso sugirieron lanzar IRows, pero muchos estuvieron de acuerdo en que es más fácil dejar que GC los maneje directamente.

Nunca libero ningún IGeometry's. Alguien lo intentó?

    
respondido por el George Silva 18.02.2011 - 03:36
1

Usaré ESRI.ArcGIS.ADF.ComReleaser. Dicho esto, no estoy exactamente seguro de qué objetos de arco utilizan un patrón de lanzamiento determinista, pero principalmente lo adjunto al objeto IServerContext, ya que es el más importante.

using (ComReleaser comReleaser = new ComReleaser())
{

}

aquí hay información que pude obtener en la cumbre de desarrolladores de esri de 2011

La lista grande que recordaba era para los objetos singleton (que son dos temas en la ayuda).

Este es el enlace de las Prácticas recomendadas para usar ArcObjects en el tema "Liberar referencias COM" de .NET: enlace

Y aquí hay una publicación en el Blog de Geodatabase para una discusión de cuatro metros que contiene una lista de objetos: enlace

(por último, una publicación de blog con un enlace para ayudar en caso de que la URL no funcione) enlace

    
respondido por el Steve 17.02.2011 - 18:27
0

No olvides los objetos IWorkspace. En la Cumbre de desarrollo de ESRI hace un par de años, formulé la pregunta, y la respuesta de ESRI fue sobre el cursor y los objetos IWorkspace.

    
respondido por el BlinkyBill 21.02.2011 - 05:22
0

¿son diferentes las reglas cuando se trabaja con objetos de servidor como un cursor en un SOI? Estoy tratando de usar ComReleaser pero falla cada vez que se acerca al método en mi código SOI

    
respondido por el VBAHole 25.09.2017 - 20:50

Lea otras preguntas en las etiquetas