Які правила звільнення ArcObjects з пам'яті в .NET?


14

Чи потрібно звільнити кожен об’єкт? Чи управляється деяким управлінням пам’яттю?

Відповіді:


18

Найголовніше, що завжди явно відпускайте курсори, коли ви закінчите з ними. Я також випускаю деякі об’єкти перерахування, які передбачають доступ до бази даних, наприклад, IEnumRelationship, який ви отримуєте від IRelationshipClass.GetRelationshipsForObject .

Крім того, коли ви створюєте безліч випадків COM, які є короткочасними (особливо у вузьких петлях), також непогано випустити їх чітко.

Існують також сценарії, коли доцільно випускати окремі посилання на функції (рядки). Наприклад, якщо ви створюєте нову версію бази даних геоданих, редагуєте дані, узгоджуєте і публікуєте, спроби видалити її згодом можуть не вдатися, оскільки можуть бути неопубліковані рядки, які, у свою чергу, зберігають посилання на версію (робочу область), яку ви намагаєтесь видалити. Здебільшого такі сценарії рідкісні, і вам не потрібно їх враховувати в щоденній розробці ArcObjects. Це зробить код лише захаращеним із сторонньою очищенням, зробивши його менш обґрунтованим.

Також важливо сказати, коли не випускати .NET обгортки - ніколи явно не випускайте RCW ArcObjects, який може використовуватися будь-яким іншим керованим кодом. Один із прикладів цього - не випускати IMap, коли в ArcMap. Взагалі, не намагайтеся випустити ArcObjects, які ви не створили.


6

Здебільшого .NET збирання сміття працює добре. У ArcObjects є деякі випадки, які виконують важливу роботу над деструкторами, і недетермінований характер обгортки .NET може спричинити проблеми. У цій довідковій темі висвітлюються основні випадки, які мають хвилюватись та як управляти випусками.



2

Завжди знищуйте:

  • ICursors
  • IEnums

Будьте обережні, щоб не знищити те, що використовується десь в іншому місці.

Сьогодні я прочитав цікаву дискусію на веб-сайті ESRI, в якій взяв участь Кірк. Були й інші дуже цікаві думки, як-от використання методу ReleaseComObject та FinalReleaseComObject (чи щось подібне). Вибачте, що зараз у мене немає посилання.

Деякі навіть пропонували випустити IRows, але багато хто погодився, що просто простіше дозволити GC керувати ними безпосередньо.

Я ніколи не випускаю жодної IGeometry. Хтось це спробував?


1

Я буду використовувати ESRI.ArcGIS.ADF.ComReleaser. При цьому я не зовсім впевнений, які об’єкти дуги використовують детерміновану схему випуску, але я здебільшого додаю її до об’єкта IServerContext, оскільки це є найважливішим.

using (ComReleaser comReleaser = new ComReleaser())
{

}

ось деяку інформацію, яку мені вдалося отримати на саміті розробників esri 2011 року.

Великий список, який я пам’ятав, стосувався об’єктів сингтона (що є довідкою на дві теми).

Це посилання з кращих практик використання ArcObjects в .NET "Випуск посилань на COM": http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Releasing_COM_references/0001000004tm000000/

А ось публікація в блозі Geodatabase для чотиримісного обговорення, що містить перелік об’єктів: http://blogs.esri.com/dev/blogs/geodatabase/archive/2010/05/18/what_2700_s‑up‑with ‑Comreleaser_3f00_.aspx

(нарешті, допис у блозі із посиланням на допомогу у випадку, коли URL не працює) http://blogs.esri.com/dev/blogs/geodatabase/archive/2008/12/18/using-the‑comreleaser‑to-manage Курсори пожиттєвого користування .net.aspx


Під час роботи з IServerContext важливіше (ніж випускати .NET RCW, як це робиться ComReleaser) - викликати ReleaseContext на ньому. Найкращий спосіб - перетворити контекст у .NET-клас, що реалізує IDisposable (та дотримуючись стандартної схеми розпорядження, включаючи реалізацію фіналізатора)
Петро Кребс,

@Petr так releaseContext - це величезна річ, і я цього не переглянув, але дякую, що написав це письмово для всіх.
Стів

2
Я вважаю, що ComReleaser є частиною 32-бітної збірки, що означає, що ви не зможете запустити ComReleaser в 64-бітовому процесі (наприклад, ArcGIS Server). Я писав про державне підприємство і отримав опік від цього.
bcollins

чи є інші варіанти для випуску сервера?
VBAHole

@VBAHole не те, що я помітив. Навіть у 10.5.1 аркобекти.
Стів

0

Не забувайте об’єкти IWorkspace. На саміті ESRI Dev кілька років тому я поставив запитання, і відповідь ESRI отримали об’єкти ICursor та IWorkspace.


Немає сенсу звільняти робочі простори, тому що вони кешовані заводськими одинаковими робочими областями.
Престон

0

Чи відрізняються правила при роботі з серверними об’єктами, як курсор в SOI? Я намагаюся використовувати ComReleaser, але це не вдається, коли він потрапляє поблизу методу в коді SOI


Не публікуйте питання як відповідь на існуюче запитання. Опублікуйте це як нове запитання із посиланням на існуюче.
Бьорн
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.