Quais são as regras para liberar o ArcObjects da memória no .NET?

14

Preciso liberar cada objeto? Algum gerenciamento de memória é tratado para mim?

patrick
fonte

Respostas:

18

Mais notavelmente, sempre libere explicitamente os cursores quando terminar. Também libero alguns objetos de enumeração que implicam acesso ao banco de dados, por exemplo, IEnumRelationship que você obtém de IRelationshipClass.GetRelationshipsForObject .

Além disso, quando você cria muitas instâncias COM de curta duração (especialmente em loops apertados), também é uma boa idéia liberá-las explicitamente.

Também existem cenários em que é aconselhável liberar referências de recursos individuais (linha). Por exemplo, se você criar uma nova versão do geodatabase, editar dados, reconciliar e postar, as tentativas de excluir a versão posteriormente poderão falhar, pois pode haver linhas não lançadas, que, por sua vez, mantêm a referência à versão (espaço de trabalho) que você está tentando excluir. Principalmente, porém, esses cenários são raros e você não precisa dar conta deles no desenvolvimento diário do ArcObjects. Isso apenas tornaria o código confuso com a limpeza externa, tornando-o menos sustentável.

Também é importante dizer quando não liberar wrappers do .NET - nunca libere explicitamente o RCW do ArcObjects, que pode estar em uso por qualquer outro código gerenciado. Um exemplo disso - não libere o IMap quando estiver no ArcMap. Em geral, não tente liberar ArcObjects que você não criou.

Petr Krebs
fonte
6

Na maior parte, a coleta de lixo do .NET funciona bem. Existem alguns casos no ArcObjects que executam trabalhos importantes em desctrutores e a natureza não determinística dos wrappers .NET pode causar problemas. Este tópico da ajuda aborda os casos principais com os quais se preocupar e como gerenciar as liberações.

Craig Williams
fonte
2

Sempre destrua:

  • ICursores
  • IEnums

Cuidado para não destruir algo que está sendo usado em outro lugar.

Hoje li uma discussão interessante no site da ESRIs da qual Kirk participou. Havia outras opiniões muito interessantes, como o uso do método ReleaseComObject e o FinalReleaseComObject (ou algo parecido). Desculpe, mas não tenho o link agora.

Alguns até sugeriram o lançamento do IRows, mas muitos concordaram que é mais fácil deixar o GC lidar com eles diretamente.

Eu nunca libero nenhum IGeometry. Alguém tentou isso?

George Silva
fonte
1

Vou usar o ESRI.ArcGIS.ADF.ComReleaser. Dito isto, não tenho certeza de quais objetos de arco usam um padrão de liberação determinístico, mas geralmente o anexo ao objeto IServerContext, pois esse é o mais crucial.

using (ComReleaser comReleaser = new ComReleaser())
{

}

aqui estão algumas informações que eu pude obter na cúpula do esri Developer em 2011.

A grande lista que eu estava lembrando era dos objetos singleton (que são dois tópicos abaixo na ajuda).

Este é o link do tópico Práticas recomendadas para usar o ArcObjects no .NET "Liberando referências COM": http://help.arcgis.com/en/sdk/10.0/arcobjects_net/conceptualhelp/index.html#/Releasing_COM_references/0001000004tm000000/

E aqui está uma postagem no Blog do Geodatabase em uma discussão de quatro metros que contém uma lista de objetos: http://blogs.esri.com/dev/blogs/geodatabase/archive/2010/05/18/what_2700_s‑up‑with ‑Comreleaser_3f00_.aspx

(por último, uma postagem de blog com um link para ajudar caso o URL não funcione) http://blogs.esri.com/dev/blogs/geodatabase/archive/2008/12/18/using‑the‑comreleaser‑to‑manage Vida útil dos cursores em .net.aspx

Steve
fonte
Ao trabalhar com IServerContext, mais crucial (do que liberar seu .NET RCW como o ComReleaser faz) é chamar ReleaseContext nele. A melhor maneira é envolver o contexto em uma classe .NET implementar IDisposable (e seguindo o padrão dispor padrão, incluindo a implementação do finalizador)
Petr Krebs
@Petr yes releaseContext é enorme e algo que eu não esqueci, mas obrigado por escrevê-lo por escrito para todos os outros.
Steve
2
Acredito que o ComReleaser faça parte de um assembly de 32 bits, o que significa que você não poderá executar o ComReleaser em um processo de 64 bits (por exemplo, ArcGIS Server). Eu estava escrevendo uma SOE e me queimei com isso.
bcollins
existem outras opções para a liberação do servidor?
VBAHole
@VBAHole não que eu tenha notado. Mesmo em 10.5.1 arcobjects.
Steve Steve
0

Não se esqueça dos objetos do IWorkspace. Na cúpula da ESRI dev, alguns anos atrás, eu fiz a pergunta, e a resposta da ESRI foram os objetos ICursor e IWorkspace.

BlinkyBill
fonte
Não há sentido em liberar espaços de trabalho porque eles são armazenados em cache pelos singletons de fábrica do espaço de trabalho.
Preston
0

as regras são diferentes ao trabalhar com objetos de servidor como um cursor em uma SOI? Estou tentando usar o ComReleaser, mas ele falha sempre que chega perto do método no meu código SOI

VBAHole
fonte
Não poste uma pergunta como resposta a uma pergunta existente. Poste-a como uma nova pergunta, com um link para a existente.
Bjorn