8 votos

ArcObjects .NET - Cómo cerrar/liberar FeatureClass, Workspace, Factory

Tengo un proceso de larga duración. Quiero evitar las fugas de recursos o las conexiones a la base de datos no autorizadas.

A intervalos durante el proceso quiero hacer esto:

  1. obtener una fábrica de espacios de trabajo de ArcSDE (Oracle)
  2. abrir un espacio de trabajo desde la fábrica (en ese momento obtengo una conexión de base de datos abierta)
  3. obtener una clase o tabla de características existente en el área de trabajo,
  4. consultar la clase o tabla de características, hacer un bucle sobre el cursor haciendo mi negocio
  5. entonces libera/cierra todo de manera que :

    • La conexión a la base de datos y el bloqueo de la tabla desde la perspectiva de ArcSDE/Oracle (como se revela con algo como "sdemon -o info -I users" o una consulta de la tabla sde.table_locks) se cierra/libera.
    • el proceso es resistente a los reinicios de ArcSDE/Oracle (es decir, no estoy dejando algo colgado que no funcionará más tarde después del reinicio nocturno)
    • Se liberan las referencias RCW, COM y la memoria.

Básicamente, debido a la larga duración del proceso, Quiero estar realmente seguro de que no tengo fugas de recursos o conexiones deshonestas, y mi proceso puede sobrevivir a los reinicios de ArcSDE/Oracle .

He visto discusiones como:

Y este De la que cito

Cada fábrica de espacios de trabajo mantiene un conjunto de espacios de trabajo activos y conectados que son referenciados por la aplicación. Cuando se llama a cualquiera de los métodos Open* enumerados anteriormente, la fábrica de espacios de trabajo verifica si se ha abierto previamente un espacio de trabajo con un conjunto de propiedades coincidentes. Si es así, se devuelve una referencia a la instancia existente.

Todo ello me sugiere que debe liberar (por ejemplo, la clase ComReleaser o el bucle equivalente Marshal.ReleaseComObject()), probablemente en este orden:

  • cursor
  • clase/tabla de características
  • espacio de trabajo
  • fábrica de espacios de trabajo

Luego hay discusiones como este donde la gente hace todo eso, y tal vez incluso espolvorear en System.GC.Collect() y su conexión de base de datos todavía vive.

Oh, gurús, ¿cuál es la información definitiva sobre esto?

1 votos

¿Has probado algo por ti mismo, o sólo estás pidiendo consejo? La apuesta más segura parece ser la de generar un nuevo hilo o proceso para hacer tu trabajo periódico. Por lo demás, en mi opinión, funcionaría si consigues localizar todos los objetos y liberarlos según tu plan. Si tienes un mapcontrol también podría contener referencias a través de las capas.

0 votos

Estoy en proceso y pido consejo. Si hago la tarea periódica en un hilo de trabajo, ¿debería el trabajador liberar la fábrica del espacio de trabajo, o siendo un singleton, causaría problemas para otros posibles hilos simultáneos? Supongo que debería dejar la fábrica sola?

0 votos

Hay mucho escrito sobre el modelo de roscado de los objetos de arco. Leer edndoc.esri.com/arcobjects/9.2/net/ (9.2 pero sigue siendo válido creo). Dice que los singeltons son singeltons por hilo, no por proceso. También hay que tener en cuenta que los hilos deben ser STA y que no se pueden pasar referencias de objetos de arco entre hilos. Así que si terminas el hilo trabajador debería limpiar las fábricas. También mira en tu propio enlace a ESRI-forum donde el threading es recomendado por ESRI como una solución para liberar las conexiones.

4voto

Farid Cher Puntos 5306

Ya has cubierto muchos aspectos en tu post. Sin embargo, para ampliar tu pregunta, sigue siempre este patrón:

if (obj!=null)
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(obj);

obj = null;

Entonces llame a System.GC.Collect() para forzar al recolector de basura a eliminar cualquier referencia al SGBD.

El orden de publicación tiene que ser Cursores, Features (IFeature), FeatureClasses, Workspaces y otros ArcObjects instanciados.

La aplicación ArcGIS Desktop y ArcEngine son STA (aplicación de un solo hilo). No es seguro ni se aconseja utilizar ArcObjects a través de hilos (Workers); se puede utilizar la serialización y deserialización de objetos para conseguirlo. Para más detalles, eche un vistazo a aquí .

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X