Jakie są zasady zwalniania ArcObjects z pamięci w .NET?


Odpowiedzi:


18

Co najważniejsze, zawsze jawnie zwalniaj kursory, gdy z nimi skończysz. Zwalniam również niektóre obiekty wyliczeniowe, które implikują dostęp do bazy danych, na przykład IEnumRelationship, który otrzymujesz z IRelationshipClass.GetRelationshipsForObject .

Ponadto, gdy tworzysz wiele instancji COM, które są krótkotrwałe (szczególnie w ciasnych pętlach), dobrym pomysłem jest ich jawne zwolnienie.

Istnieją również scenariusze, w których wskazane jest zwolnienie referencji poszczególnych funkcji (wierszy). Na przykład, jeśli utworzysz nową wersję geobazy, edytujesz dane, uzgadniasz i publikujesz, próby późniejszego usunięcia wersji mogą się nie powieść, ponieważ mogą istnieć niepublikowane wiersze, które z kolei zachowują odniesienie do wersji (obszaru roboczego), którą próbujesz usunąć. Przeważnie jednak takie scenariusze są rzadkie i nie trzeba ich uwzględniać w codziennym rozwoju ArcObjects. Spowodowałoby to jedynie zaśmiecenie kodu obcym czyszczeniem, co utrudniłoby jego utrzymanie.

Ważne jest również, aby powiedzieć, kiedy nie należy wypuszczać opakowań .NET - nigdy nie należy jawnie wypuszczać RCW ArcObjects, które mogą być używane przez jakikolwiek inny zarządzany kod. Jeden przykład tego - nie zwalniaj IMap w ArcMap. Zasadniczo nie próbuj wypuszczać ArcObjectów, których nie utworzyłeś.



2

Zawsze niszcz:

  • ICursory
  • IEnums

Uważaj, aby nie zniszczyć czegoś, co jest używane gdzie indziej.

Dzisiaj przeczytałem ciekawą dyskusję na stronie internetowej ESRI, w której uczestniczył Kirk. Były też inne bardzo interesujące opinie, takie jak użycie metody ReleaseComObject i FinalReleaseComObject (lub coś podobnego). Przepraszam, nie mam teraz linku do mnie.

Niektórzy nawet sugerowali wydanie IRows, ale wielu zgodziło się, że łatwiej jest pozwolić GC bezpośrednio na ich obsługę.

Nigdy nie wypuszczam żadnych IGeometrii. Ktoś tego próbował?


1

Użyję ESRI.ArcGIS.ADF.ComReleaser. Biorąc to pod uwagę, nie jestem do końca pewien, które obiekty łukowe używają deterministycznego wzorca uwalniania, ale w większości dołączam go do obiektu IServerContext, ponieważ jest to najważniejsze.

using (ComReleaser comReleaser = new ComReleaser())
{

}

oto kilka informacji, które udało mi się uzyskać na szczycie programistów esri w 2011 roku.

Duża lista, którą zapamiętałem, dotyczyła obiektów singletonowych (czyli dwa tematy w dalszej części pomocy).

To jest link do najlepszych praktyk dotyczących używania ArcObjects w .NET „Wydawanie odniesień COM”: http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Releasing_COM_references/0001000004tm000000/

A tutaj jest post na blogu Geodatabase do czteromilionowej dyskusji, która zawiera listę obiektów: http://blogs.esri.com/dev/blogs/geodatabase/archive/2010/05/18/what_2700_s‑up‑with ‑Comreleaser_3f00_.aspx

(na koniec post na blogu z linkiem do pomocy w przypadku, gdyby adres URL nie zadziałał) http://blogs.esri.com/dev/blogs/geodatabase/archive/2008/12/18/using‑the‑comreleaser‑to‑manage -The-lifetime-of-cursors-in-.net.aspx


Podczas pracy z IServerContext ważniejsze (niż wypuszczenie jej .NET RCW tak jak robi to ComReleaser) jest wywołanie na nim ReleaseContext. Najlepszym sposobem jest owinąć kontekst, w klasie .NET wdrożenie IDisposable (a po standardowego wzorca rozporządzania tym wdrażanie finalizatora)
Petr Krebs

@Petr yes releaseContext jest ogromny i coś, czego nie przeoczyłem, ale dziękuję za napisanie go dla wszystkich.
Steve

2
Uważam, że ComReleaser jest częścią 32-bitowego zestawu, co oznacza, że ​​nie będzie można uruchomić ComReleaser w procesie 64-bitowym (np. ArcGIS Server). Pisałem SOE i poparzyło mnie to.
bcollins

czy są inne opcje wydania serwera?
VBAHole,

@VBAHole, nie zauważyłem. Nawet w przypadku obiektów Arc 10.5.1.
Steve

0

Nie zapomnij o obiektach IWorkspace. Kilka lat temu na szczycie deweloperów ESRI zadałem pytanie, a odpowiedzią ESRI były obiekty ICursor i IWorkspace.


Zwalnianie obszarów roboczych nie ma sensu, ponieważ są one buforowane przez singletony fabryki obszarów roboczych.
Preston,

0

czy reguły różnią się podczas pracy z obiektami serwera, takimi jak kursor w SOI? Próbuję użyć ComReleaser, ale kończy się niepowodzeniem za każdym razem, gdy zbliży się do metody w moim kodzie SOI


Nie publikuj pytania jako odpowiedzi na istniejące pytanie. Opublikuj je jako nowe pytanie, z linkiem do istniejącego.
Bjorn,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.