Ответы:
В частности, всегда явно освобождайте курсоры, когда вы закончите с ними. Я также освобождаю некоторые объекты перечисления, которые подразумевают доступ к базе данных, например IEnumRelationship, который вы получаете от IRelationshipClass.GetRelationshipsForObject .
Кроме того, когда вы создаете много экземпляров COM, которые являются недолговечными (особенно в тесных циклах), также будет хорошей идеей их явное освобождение.
Существуют также сценарии, когда рекомендуется выпускать ссылки на отдельные функции (строки). Например, если вы создаете новую версию базы геоданных, редактируете данные, согласовываете и публикуете, попытки удалить версию впоследствии могут потерпеть неудачу, поскольку могут быть невыпущенные строки, которые в свою очередь сохраняют ссылку на версию (рабочую область), которую вы пытаетесь удалить. Однако в большинстве случаев такие сценарии встречаются редко, и вам не нужно учитывать их в повседневной разработке ArcObjects. Это только сделает код загроможденным посторонней очисткой, сделав его менее обслуживаемым.
Также важно сказать, когда не следует выпускать оболочки .NET - никогда не выпускайте явно RCW ArcObjects, который может использоваться любым другим управляемым кодом. Один из примеров этого - не выпускать IMap в ArcMap. В общем, не пытайтесь выпустить ArcObjects, которые вы не создали.
По большей части .NET сборка мусора работает хорошо. В ArcObjects есть несколько случаев, которые выполняют важную работу с десктрукторами, и недетерминированный характер оболочек .NET может вызвать проблемы. В этом разделе справки рассматриваются основные случаи, которые необходимо учитывать, и способы управления выпусками.
Всегда уничтожать:
Будьте осторожны, чтобы не уничтожить то, что используется где-то еще.
Сегодня я прочитал интересную дискуссию на сайте ESRI, в которой участвовал Кирк. Были и другие очень интересные мнения, такие как использование метода ReleaseComObject и FinalReleaseComObject (или что-то подобное). Извините, у меня сейчас нет ссылки на меня.
Некоторые даже предлагали выпустить IRow, но многие согласились с тем, что просто позволить GC обрабатывать их напрямую.
Я никогда не выпускаю IGeometry's. Кто-нибудь пробовал это?
Я буду использовать 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/
А вот запись в блоге базы геоданных для обсуждения в формате четырехм, которая содержит список объектов: 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 -The-срок службы, из-курсоров-в-.net.aspx
Не забывайте об объектах IWorkspace. На саммите разработчиков ESRI пару лет назад я задал вопрос, и ответ от ESRI был объектами ICursor и IWorkspace.
отличаются правила при работе с объектами сервера, такими как курсор в SOI? Я пытаюсь использовать ComReleaser, но он терпит неудачу каждый раз, когда он приближается к методу в моем коде SOI