Welche Regeln gelten für die Freigabe von ArcObjects aus dem Speicher in .NET?

14

Muss ich jedes Objekt freigeben? Wird eine Speicherverwaltung für mich durchgeführt?

Patrick
quelle

Antworten:

18

Vor allem sollten Sie Cursor immer explizit freigeben, wenn Sie damit fertig sind. Ich gebe auch einige Aufzählungsobjekte frei, die einen Datenbankzugriff implizieren, zum Beispiel IEnumRelationship, das Sie von IRelationshipClass.GetRelationshipsForObject erhalten .

Wenn Sie viele COM-Instanzen erstellen, die nur von kurzer Dauer sind (insbesondere in engen Schleifen), empfiehlt es sich, sie explizit freizugeben.

Es gibt auch Szenarien, in denen es ratsam ist, einzelne Feature- (Zeilen-) Verweise freizugeben. Wenn Sie beispielsweise eine neue Geodatabase-Version erstellen, Daten bearbeiten, abgleichen und veröffentlichen, schlagen Versuche, die Version anschließend zu löschen, möglicherweise fehl, da möglicherweise nicht freigegebene Zeilen vorhanden sind, die wiederum auf die Version (den Arbeitsbereich) verweisen, die Sie löschen möchten. In den meisten Fällen sind solche Szenarien jedoch selten und müssen bei der täglichen Entwicklung von ArcObjects nicht berücksichtigt werden. Dies würde den Code nur mit unnötiger Bereinigung überfrachten und ihn weniger wartbar machen.

Es ist auch wichtig zu sagen, wann .NET-Wrapper nicht freigegeben werden sollen - geben Sie niemals RCW von ArcObjects explizit frei, die möglicherweise von einem anderen verwalteten Code verwendet werden. Ein Beispiel hierfür: Geben Sie IMap in ArcMap nicht frei. Versuchen Sie im Allgemeinen nicht, ArcObjects freizugeben, die Sie nicht erstellt haben.

Petr Krebs
quelle
6

Zum größten Teil funktioniert die .NET-Garbage-Collection gut. In ArcObjects gibt es einige Fälle, in denen wichtige Arbeiten an Desktruktoren ausgeführt werden, und die nicht deterministische Natur der .NET-Wrapper kann Probleme verursachen. In diesem Hilfethema werden die wichtigsten Fälle und das Verwalten von Releases behandelt.

Craig Williams
quelle
2
Der gleiche Link in 10: help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/…
MathiasWestin
2

Immer zerstören:

  • ICursors
  • IEnums

Achten Sie darauf, dass Sie nichts zerstören, was woanders verwendet wird.

Heute habe ich eine interessante Diskussion auf der ESRI-Website gelesen, an der Kirk teilgenommen hat. Es gab andere sehr interessante Meinungen, wie die Verwendung der ReleaseComObject-Methode und des FinalReleaseComObject (oder ähnliches). Entschuldigung, ich habe den Link gerade nicht.

Einige schlugen sogar vor, IRows zu veröffentlichen, aber viele waren sich einig, dass es einfach einfacher ist, GC direkt damit umzugehen.

Ich gebe niemals IGeometrys heraus. Hat das jemand versucht?

George Silva
quelle
1

Ich werde den ESRI.ArcGIS.ADF.ComReleaser verwenden. Abgesehen davon bin ich mir nicht ganz sicher, welche Bogenobjekte ein deterministisches Auslösemuster verwenden, aber ich hänge es meistens an das IServerContext-Objekt an, da dies das wichtigste ist.

using (ComReleaser comReleaser = new ComReleaser())
{

}

Hier sind einige Informationen, die ich auf dem esri Developer Summit 2011 erhalten habe.

Die große Liste, an die ich mich erinnerte, betraf die Singleton-Objekte (zwei Themen in der Hilfe).

Dies ist der Link aus den Best Practices für die Verwendung von ArcObjects in .NET zum Thema "Freigeben von COM-Referenzen": http://help.arcgis.com/de/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Releasing_COM_references/0001000004tm000000/

Und hier ist ein Beitrag im Geodatabase-Blog zu einer vierminütigen Diskussion, die eine Liste von Objekten enthält: http://blogs.esri.com/dev/blogs/geodatabase/archive/2010/05/18/what_2700_s‑up‑with ‑Comreleaser_3f00_.aspx

(schließlich eine Blog - Post mit einem Link zu Hilfe bei der URL nicht funktioniert hat ) http://blogs.esri.com/dev/blogs/geodatabase/archive/2008/12/18/using-the-comreleaser-to-manage Die Lebensdauer der Cursor in .net.aspx

Steve
quelle
Wenn Sie mit IServerContext arbeiten, ist es wichtiger, ReleaseContext aufzurufen, als .NET RCW wie ComReleaser freizugeben. Der beste Weg ist, den Kontext in eine .NET-Klasse zu packen, die IDisposable implementiert (und dem Standard-Entsorgungsmuster einschließlich der Implementierung des Finalizers folgt)
Petr Krebs,
@Petr yes releaseContext ist riesig und etwas, das ich nicht übersehen habe, aber danke, dass Sie es für alle anderen schriftlich niedergelegt haben.
Steve
2
Ich glaube, dass ComReleaser Teil einer 32-Bit-Assembly ist, was bedeutet, dass Sie ComReleaser in einem 64-Bit-Prozess (z. B. ArcGIS Server) nicht ausführen können. Ich habe ein SOE geschrieben und mich dabei verbrannt.
Bcollins
Gibt es andere Optionen für die Serverfreigabe?
VBAHole
@VBAHole nicht das ich es gemerkt habe. Auch bei 10.5.1 arcobjects.
Steve
0

Vergessen Sie nicht IWorkspace-Objekte. Auf dem ESRI Dev Summit vor ein paar Jahren stellte ich die Frage, und die Antwort von ESRI lautete ICursor und IWorkspace-Objekte.

BlinkyBill
quelle
Es ist nicht sinnvoll, Arbeitsbereiche freizugeben, da sie von den Singletons der Workspace Factory zwischengespeichert werden.
Preston
0

Unterscheiden sich die Regeln, wenn Sie mit Serverobjekten wie einem Cursor in einer SOI arbeiten? Ich versuche, ComReleaser zu verwenden, aber es schlägt jedes Mal fehl, wenn es sich der Methode in meinem SOI-Code annähert

VBAHole
quelle
Stellen Sie keine Frage als Antwort auf eine vorhandene Frage. Stellen Sie es als neue Frage mit einem Link zu der vorhandenen Frage.
Bjorn