Antworten:
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.
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.
Immer zerstören:
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?
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
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.
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