Відповіді:
Найголовніше, що завжди явно відпускайте курсори, коли ви закінчите з ними. Я також випускаю деякі об’єкти перерахування, які передбачають доступ до бази даних, наприклад, IEnumRelationship, який ви отримуєте від IRelationshipClass.GetRelationshipsForObject .
Крім того, коли ви створюєте безліч випадків COM, які є короткочасними (особливо у вузьких петлях), також непогано випустити їх чітко.
Існують також сценарії, коли доцільно випускати окремі посилання на функції (рядки). Наприклад, якщо ви створюєте нову версію бази даних геоданих, редагуєте дані, узгоджуєте і публікуєте, спроби видалити її згодом можуть не вдатися, оскільки можуть бути неопубліковані рядки, які, у свою чергу, зберігають посилання на версію (робочу область), яку ви намагаєтесь видалити. Здебільшого такі сценарії рідкісні, і вам не потрібно їх враховувати в щоденній розробці ArcObjects. Це зробить код лише захаращеним із сторонньою очищенням, зробивши його менш обґрунтованим.
Також важливо сказати, коли не випускати .NET обгортки - ніколи явно не випускайте RCW ArcObjects, який може використовуватися будь-яким іншим керованим кодом. Один із прикладів цього - не випускати IMap, коли в ArcMap. Взагалі, не намагайтеся випустити ArcObjects, які ви не створили.
Здебільшого .NET збирання сміття працює добре. У ArcObjects є деякі випадки, які виконують важливу роботу над деструкторами, і недетермінований характер обгортки .NET може спричинити проблеми. У цій довідковій темі висвітлюються основні випадки, які мають хвилюватись та як управляти випусками.
Завжди знищуйте:
Будьте обережні, щоб не знищити те, що використовується десь в іншому місці.
Сьогодні я прочитав цікаву дискусію на веб-сайті ESRI, в якій взяв участь Кірк. Були й інші дуже цікаві думки, як-от використання методу ReleaseComObject та FinalReleaseComObject (чи щось подібне). Вибачте, що зараз у мене немає посилання.
Деякі навіть пропонували випустити IRows, але багато хто погодився, що просто простіше дозволити GC керувати ними безпосередньо.
Я ніколи не випускаю жодної IGeometry. Хтось це спробував?
Я буду використовувати 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
Не забувайте об’єкти IWorkspace. На саміті ESRI Dev кілька років тому я поставив запитання, і відповідь ESRI отримали об’єкти ICursor та IWorkspace.
Чи відрізняються правила при роботі з серверними об’єктами, як курсор в SOI? Я намагаюся використовувати ComReleaser, але це не вдається, коли він потрапляє поблизу методу в коді SOI