Каковы правила для освобождения ArcObjects из памяти в .NET?

Ответы:

18

В частности, всегда явно освобождайте курсоры, когда вы закончите с ними. Я также освобождаю некоторые объекты перечисления, которые подразумевают доступ к базе данных, например IEnumRelationship, который вы получаете от IRelationshipClass.GetRelationshipsForObject .

Кроме того, когда вы создаете много экземпляров COM, которые являются недолговечными (особенно в тесных циклах), также будет хорошей идеей их явное освобождение.

Существуют также сценарии, когда рекомендуется выпускать ссылки на отдельные функции (строки). Например, если вы создаете новую версию базы геоданных, редактируете данные, согласовываете и публикуете, попытки удалить версию впоследствии могут потерпеть неудачу, поскольку могут быть невыпущенные строки, которые в свою очередь сохраняют ссылку на версию (рабочую область), которую вы пытаетесь удалить. Однако в большинстве случаев такие сценарии встречаются редко, и вам не нужно учитывать их в повседневной разработке ArcObjects. Это только сделает код загроможденным посторонней очисткой, сделав его менее обслуживаемым.

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

Петр Кребс
источник
6

По большей части .NET сборка мусора работает хорошо. В ArcObjects есть несколько случаев, которые выполняют важную работу с десктрукторами, и недетерминированный характер оболочек .NET может вызвать проблемы. В этом разделе справки рассматриваются основные случаи, которые необходимо учитывать, и способы управления выпусками.

Крейг Уильямс
источник
2
Та же ссылка в 10: help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/…
MathiasWestin
2

Всегда уничтожать:

  • ICursors
  • IEnums

Будьте осторожны, чтобы не уничтожить то, что используется где-то еще.

Сегодня я прочитал интересную дискуссию на сайте ESRI, в которой участвовал Кирк. Были и другие очень интересные мнения, такие как использование метода ReleaseComObject и FinalReleaseComObject (или что-то подобное). Извините, у меня сейчас нет ссылки на меня.

Некоторые даже предлагали выпустить IRow, но многие согласились с тем, что просто позволить GC обрабатывать их напрямую.

Я никогда не выпускаю IGeometry's. Кто-нибудь пробовал это?

Джордж Сильва
источник
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/

А вот запись в блоге базы геоданных для обсуждения в формате четырехм, которая содержит список объектов: 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

Стив
источник
При работе с IServerContext более важным (чем выпускать .NET RCW, как это делает ComReleaser) является вызов ReleaseContext для него. Лучший способ - обернуть контекст в класс .NET, реализующий IDisposable (и следуя стандартному шаблону dispose, включая реализацию финализатора)
Петр Кребс,
@Petr да releaseContext огромен и кое-что я не пропустил, но спасибо за то, что написали это для всех остальных.
Стив
2
Я считаю, что ComReleaser является частью 32-битной сборки, что означает, что вы не сможете запустить ComReleaser в 64-битном процессе (например, ArcGIS Server). Я писал SOE и сгорел от этого.
bcollins
Есть ли другие варианты для выпуска сервера?
VBAHole,
@VBAHole не то, что я заметил. Даже на 10.5.1 аркобъекты.
Стив
0

Не забывайте об объектах IWorkspace. На саммите разработчиков ESRI пару лет назад я задал вопрос, и ответ от ESRI был объектами ICursor и IWorkspace.

BlinkyBill
источник
Нет смысла освобождать рабочие пространства, потому что они кэшируются фабричными синглетами рабочей области.
Престон
0

отличаются правила при работе с объектами сервера, такими как курсор в SOI? Я пытаюсь использовать ComReleaser, но он терпит неудачу каждый раз, когда он приближается к методу в моем коде SOI

VBAHole
источник
Не публикуйте вопрос как ответ на существующий вопрос. Опубликуйте его как новый вопрос со ссылкой на существующий.
Бьорн,