ArcObjects .NET - Como fechar / liberar FeatureClass, Workspace, Factory


8

Eu tenho um processo de longa duração. Quero evitar vazamentos de recursos ou conexões de bancos de dados não autorizados.

Em intervalos durante o processo, eu quero fazer isso:

  1. obter uma fábrica da área de trabalho do ArcSDE (Oracle)
  2. abrir um espaço de trabalho da fábrica (nesse momento, recebo uma conexão de banco de dados aberta)
  3. obtenha uma classe ou tabela de recurso existente na área de trabalho,
  4. consulta a classe ou tabela de recursos, passa o cursor sobre o cursor fazendo meus negócios
  5. libere / feche tudo de forma que :

    • A conexão com o banco de dados e o bloqueio de tabela da perspectiva do ArcSDE / Oracle (como revelado por algo como "sdemon -o info -I users" ou uma consulta da tabela sde.table_locks) são fechados / liberados.
    • o processo é resiliente à reinicialização do ArcSDE / Oracle (ou seja, não deixo algo pendente que não funcione mais tarde após o reinício noturno)
    • Qualquer RCW, referências COM e memória são liberadas.

Basicamente, devido à natureza de longa duração do processo, quero ter certeza de que não tenho vazamentos de recursos ou conexões não autorizadas, e meu processo pode sobreviver à reinicialização do ArcSDE / Oracle .

Eu já vi discussões como:

E isso , do qual cito

Cada fábrica da área de trabalho mantém um conjunto de áreas de trabalho ativas conectadas no momento e referenciadas pelo aplicativo. Quando qualquer um dos métodos Open * listados anteriormente é chamado, o factory do espaço de trabalho verifica se um espaço de trabalho foi aberto anteriormente com um conjunto de propriedades correspondente. Nesse caso, uma referência à instância existente é retornada.

Tudo o que me sugere que eu deveria liberar (por exemplo, classe ComReleaser ou equivalente Marshal.ReleaseComObject () loop), provavelmente nesta ordem:

  • cursor
  • featureclass / table
  • área de trabalho
  • fábrica de espaço de trabalho

Depois, há discussões como esta, onde as pessoas fazem tudo isso, e talvez até polvilhem System.GC.Collect () e sua conexão com o banco de dados ainda existe.

Oh gurus, qual é a droga final definitiva sobre isso?


1
Você já tentou alguma coisa ou está apenas pedindo conselhos? A aposta mais segura parece gerar um novo segmento ou processo para você realizar um trabalho periódico. Caso contrário, na minha opinião, funcionaria se você conseguir rastrear todos os objetos e liberá-los de acordo com seu plano. Se você tiver um controle de mapa, ele também poderá conter referências através das camadas.
21413 Stefan #

Estou em andamento e pedindo conselhos. Aqui está uma pergunta de acompanhamento do seu comentário - Se eu executar a tarefa periódica em um segmento de trabalho, o trabalhador deve liberar a fábrica da área de trabalho ou ser um singleton que causará probs para outros possíveis segmentos simultâneos? Meu palpite é que devo deixar a fábrica sozinha?
MC5

Há muito escrito sobre o modelo de encadeamento de objetos de arco. Leia edndoc.esri.com/arcobjects/9.2/net/… (9.2, mas ainda é válido, eu acho). Diz que os singeltons são singeltons por thread, não por processo. Observe também que os threads devem ser STA e que você não pode passar referências a objetos de arco entre os threads. Portanto, se você encerrar o segmento de trabalho, ele deverá limpar as fábricas. Consulte também o seu próprio link para o fórum da ESRI, em que a ESRI recomenda o encadeamento como uma solução para liberar conexões.
Stefan

Respostas:


4

Você já abordou muitos aspectos em sua postagem. No entanto, para expandir sua pergunta, sempre siga este padrão:

if (obj!=null)
ESRI.ArcGIS.ADF.ComReleaser.ReleaseCOMObject(obj);

obj = null;

Em seguida, chame System.GC.Collect()para forçar o coletor de lixo a remover quaisquer referências ao DBMS.

A ordem da liberação deve ser Cursores, Recursos (IFeature), FeatureClasses, Áreas de Trabalho e outros ArcObjects instanciados.

Os aplicativos ArcGIS Desktop e ArcEngine são STA (aplicativo de thread único). Não é seguro nem recomendado usar o ArcObjects entre threads (Workers); Pode-se usar serialização e desserialização de objetos para conseguir isso. Para mais detalhes, dê uma olhada aqui .

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.