ArcObjects rodando em Addin mais devagar?

9

Eu criei uma biblioteca de classes que faz algum geoprocessamento. O suplemento chama uma classe que é um processo assíncrono. Eu garanti que o thread é STA e os arcobjects são thread-safe (ou seja, não foram passados ​​do addin). Todos os objetos de arco são criados dentro do encadeamento.

Por ser uma biblioteca de classes, envolvi-a em uma interface do winforms e também como um complemento. Ambos os conjuntos de códigos são exatamente os mesmos e o teste foi realizado usando exatamente os mesmos dados. Tanto o winforms quanto o addin completam o código com os resultados desejados e nenhum vazamento de memória é evidente. Para o caso do complemento, não há interação com o período do mapa neste momento e também não há elementos de mapeamento ou exibição no código do winforms.

as únicas atualizações da interface do usuário são a atualização de uma caixa de diálogo de progresso no suplemento e na interface do usuário. O complemento está usando uma janela acoplável (interface do usuário de controle do usuário).

O problema que estou vendo é que quando a biblioteca é chamada a partir do suplemento, a execução do código é 5x mais lenta que o mesmo código chamado pelo aplicativo winforms.

Alguma idéia de onde devo procurar para ver por que isso está ocorrendo?

Justin Carasick
fonte
Você está usando singletons de arcobjects ?
Kirk Kuykendall
Sim, uma rápida olhada na lista e estou usando alguns objetos de espaço de trabalho para abrir minhas classes de características independentes do ArcMap para que elas sejam criadas dentro do encadeamento. Estou criando dois aspectos do espaço de trabalho (para minha entrada e saída) e, em seguida, fazendo loop e armazenando em cache dados localmente usando um espaço de trabalho memorizado, que eu uso uma fábrica para criar. Devo criar o espaço de trabalho da memória apenas uma vez? Devo mencionar que o código não falha e é lento apenas quando executado dentro do addin.
Justin Carasick
Você está criando usando Activator.CreateInstance, ou com new?
Kirk Kuykendall
Estou (ou estava) usando o novo. Estou atualizando agora para experimentar o método Activator.CreateInstance.
23713 Justin Carasick
Atualizei o código (obrigado por apontar isso), mas não vejo uma diferença real com a atualização.
23813 Justin Carasick

Respostas:

1

Ao comparar as duas versões, você pode estar cronometrando mais do que apenas o tempo de geoprocessamento.

Talvez existam alguns procedimentos de inicialização em execução no seu aplicativo independente que já são executados no ArcMap na inicialização, por exemplo, criação de objeto MxDocument, verificação de licença, criação de GDB inicial, etc.

Também pode haver uma diferença na versão do .NET Framework usada no ArcMap e no aplicativo da área de trabalho (embora eu não veja isso causando uma redução de 5x).

Berend
fonte