ArcObjects .NET - Comment fermer / libérer FeatureClass, Workspace, Factory

8

J'ai un processus de longue haleine. Je souhaite éviter les fuites de ressources ou les connexions de base de données malveillantes.

À des intervalles au cours du processus, je veux faire ceci:

  1. obtenir une fabrique d'espace de travail ArcSDE (Oracle)
  2. ouvrir un espace de travail de l'usine (auquel point j'obtiens une connexion de base de données ouverte)
  3. obtenir une classe d'entités ou une table existante sur l'espace de travail,
  4. interroger la classe d'entités ou la table, faire une boucle sur le curseur pour faire mes affaires
  5. puis relâchez / fermez tout ce qui :

    • La connexion à la base de données et le verrouillage de table du point de vue d'ArcSDE / Oracle (comme révélé par quelque chose comme "sdemon -o info -I users" ou une requête de la table sde.table_locks) est fermé / libéré.
    • le processus résiste aux redémarrages d'ArcSDE / Oracle (c'est-à-dire que je ne laisse pas quelque chose en suspens qui ne fonctionnera pas plus tard après le redémarrage nocturne)
    • Toutes les références RCW, COM et mémoire sont libérées.

Fondamentalement, en raison de la nature longue du processus, je veux être vraiment sûr de ne pas avoir de fuites de ressources ou de connexions malveillantes, et mon processus peut survivre au redémarrage d'ArcSDE / Oracle .

J'ai vu des discussions telles que:

Et cela , dont je cite

Chaque fabrique d'espace de travail gère un pool d'espaces de travail actifs actuellement connectés qui sont référencés par l'application. Lorsqu'une des méthodes Open * répertoriées précédemment est appelée, la fabrique d'espace de travail vérifie si un espace de travail a déjà été ouvert avec un ensemble de propriétés correspondant. Si tel est le cas, une référence à l'instance existante est renvoyée.

Tout cela me porte à croire que je devrais sortir (par exemple classe ComReleaser ou boucle Marshal.ReleaseComObject () équivalent), probablement dans cet ordre:

  • le curseur
  • classe / table
  • espace de travail
  • usine d'espace de travail

Ensuite, il y a des discussions comme celle-ci où les gens font tout cela, et peut-être même saupoudrer dans System.GC.Collect () et leur connexion à la base de données est toujours en vie.

Oh gourous, quelle est la dernière drogue droite à ce sujet?

MC5
la source
1
Avez-vous essayé quelque chose vous-même ou demandez-vous simplement des conseils? Le pari le plus sûr semble engendrer un nouveau fil ou processus pour vous faire un travail périodique. Sinon, à mon avis, cela fonctionnerait si vous parvenez à retrouver tous les objets et à les libérer selon votre plan. Si vous avez un mapcontrol, il peut également contenir des références à travers les couches.
Stefan
Je suis en cours et je demande des conseils. Voici une question de suivi à votre commentaire - Si je fais la tâche périodique sur un thread de travail, le travailleur devrait-il libérer la fabrique d'espace de travail, ou s'il s'agit d'un singleton, cela causera-t-il des problèmes pour d'autres threads simultanés possibles? Je suppose que je devrais laisser l'usine tranquille?
MC5
Il y a beaucoup d'écrit sur le modèle de filetage des objets d'arc. Lisez edndoc.esri.com/arcobjects/9.2/net/… (9.2 mais il est toujours valable je pense). Il dit que les singeltons sont des singeltons par thread, pas par processus. Notez également que les threads doivent être STA et que vous ne pouvez pas passer de références d'objets d'arc entre les threads. Donc, si vous terminez le thread de travail, cela devrait nettoyer les usines. Regardez également dans votre propre lien vers le forum ESRI où le filetage est recommandé par ESRI comme solution pour libérer des connexions.
Stefan

Réponses:

4

Vous avez déjà couvert de nombreux aspects dans votre message. Cependant, pour développer votre question, suivez toujours ce modèle:

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

obj = null;

Appelez ensuite System.GC.Collect()pour forcer le garbage collector à supprimer toutes les références au SGBD.

L'ordre de publication doit être les curseurs, les fonctionnalités (IFeature), les FeatureClasses, les espaces de travail et autres ArcObjects instanciés.

ArcGIS Desktop et l'application ArcEngine sont STA (application à thread unique). Il n'est ni sûr ni conseillé d'utiliser ArcObjects sur des threads (Workers); On peut utiliser la sérialisation et la désérialisation des objets pour y parvenir. Pour plus de détails, jetez un œil ici .

Farid Cheraghi
la source